映射逻辑功能

时间:2013-11-14 11:44:47

标签: clojure

我正在尝试使用地图和逻辑功能“和”

加入两个列表
(map and '(true false true) '(0 1 2))

我希望看到

(0 false 2)

而不是那个

CompilerException java.lang.RuntimeException: Can't take value of a macro:
#'clojure.core/and, compiling:(NO_SOURCE_PATH:274:1)

occures。

我该如何解决?

2 个答案:

答案 0 :(得分:4)

你可以包装"和"宏成功能

(map #(and % %2) '(true false true) '(0 1 2))

Result:(0 false 2)

地图功能不允许您使用宏作为第一个参数,因此这是解决问题的简单方法

答案 1 :(得分:2)

接受的答案肯定是可靠的,我只想给你一个将宏转换为函数的例子(主要是为了娱乐/学习目的):

(defmacro to-fun [macro]       ;; converting a macro to a function 
  `#(eval (cons '~macro %&)))  ;; e.g. "eval"uated at run time vs. compile time, 
                               ;; and hence can be composed

现在我们可以用它包装一个(ny)宏:

(map (to-fun and) [true false true] [0 1 2])
(0 false 2) 

或:

(map (to-fun or) [true false true] [0 1 2])
(true 1 true)