在结束时,我们如何将and
或任何其他宏应用于列表?
这不起作用:
(apply and '(true false))
因为apply
无法获取宏的值。
那么,检查列表中所有元素是否为真的最佳方法是什么?
答案 0 :(得分:35)
答案 1 :(得分:6)
在Clojure中宏不是一流的东西它们不像函数那样构成,你不能将它们传递给其他函数,你不能apply
它们。这是因为在完成任何申请之前,他们已完成并完成。
习惯上将函数中的宏包装到apply
或将它们传递给函数
(defmacro my-macro [x y z] ...)
(apply #(my-macro %1 %2 %3) [1 2 3])
(map #(my-macro) [1 2 3] [:a :b :c] [a b c])
匿名功能阅读器宏#(
使得这一点变得如此简单,以至于不是一流的宏并不会带来不便。只需尝试remember the first rule of macro club
答案 2 :(得分:2)
你也可以这样做:
(apply = true '(true false))
答案 3 :(得分:0)
user=> (eval `(and ~@(list true false)))
false
user=> (eval `(and ~@ (list true true 1)))
1
我是语法引用,然后应用一个大大锤来移除集合周围的括号,因为我引用它,必须使用eval。如果您要创建一个宏并且传入的函数是'和',那么这很有用。
所以锤打的(list 1 2 3)
雪橇变为1 2 3
。
这是一种方式,非常可怕,但它确实有效,所以我觉得这对我来说很好。 所以我的clojure不是很好,但我希望这个宏观例子可以解决问题。
(defmacro split-my-args-then-apply-fn
"This is one terrible macro designed to show the use of 'and'."
[fun coll & args]
`(~fun ~@((apply juxt args) coll)))
用法(从不):
(split-my-args-then-apply-fn
and
{:something :true :something-else false}
:something :something-else)