0

我正在尝试使用地图和逻辑函数“和”共同加入两个列表

(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)

发生。

我该如何解决?

4

2 回答 2

4

您可以将“and”宏包装到一个函数中

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

Result:(0 false 2)

map 函数不允许您使用宏作为第一个参数,所以这是解决问题的简单技巧

于 2013-11-14T12:08:39.813 回答
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)
于 2013-11-14T20:24:25.423 回答