我正在尝试使用地图和逻辑函数“和”共同加入两个列表
(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)
发生。
我该如何解决?
我正在尝试使用地图和逻辑函数“和”共同加入两个列表
(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)
发生。
我该如何解决?
您可以将“and”宏包装到一个函数中
(map #(and % %2) '(true false true) '(0 1 2))
Result:(0 false 2)
map 函数不允许您使用宏作为第一个参数,所以这是解决问题的简单技巧
接受的答案绝对是可靠的,我只是想给您一个将宏转换为函数的示例(主要用于娱乐/学习目的):
(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)