我正在尝试使用地图和逻辑功能“和”
加入两个列表(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。
我该如何解决?
答案 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)