在clojure中,如何将'和'应用到列表中?

时间:2012-02-09 20:13:35

标签: clojure

在结束时,我们如何将and或任何其他宏应用于列表?

这不起作用:

(apply and '(true false))

因为apply无法获取宏的值。

那么,检查列表中所有元素是否为真的最佳方法是什么?

4 个答案:

答案 0 :(得分:35)

您可以这样做:

(every? identity '(true false))

有关详细信息,请参阅this thread

答案 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)