使用Clojure中的逻辑函数"reduce"或"apply"

Ale*_*x B 31 clojure

我不能在Clojure(1.2)中对一系列布尔值使用逻辑函数.由于逻辑函数是宏,以下两种方法都不起作用:

(reduce and [... sequence of bools ...])
(apply or [... sequence of bools ...])
Run Code Online (Sandbox Code Playgroud)

错误消息说我"无法获取宏的值:#'clojure.core/and".如何在不编写样板代码的情况下应用这些逻辑函数(宏)?

Mic*_*zyk 52

不要 - 使用every?some不是.

  • 链接到docs,[`every?`](http://clojuredocs.org/clojure_core/clojure.core/every_q)和[`some`](http://clojuredocs.org/clojure_core/clojure.core/some) . (6认同)

mik*_*era 14

Michal的答案已经确定,但是当您想要将宏用作函数时,以下替代方法在类似情况下非常有用:

(reduce #(and %1 %2) [... sequence of bools ...])

基本上你只需将宏包装在一个匿名函数中.

考虑这种方法有几个很好的理由:

  • 存在类似someevery?不存在的便利功能的情况
  • 您可能会获得更好的性能(减少可能会从将来的一些非常好的优化中受益,例如将函数直接应用于向量而不是将向量转换为序列)