如何使Clojure宏充当函数,所以我可以将它作为参数传递给你?我希望不得不以某种方式包装它.
我不希望包装版本的行为与原始宏完全相同(按名称调用与按值调用的差异),但在少数情况下这不重要.
trp*_*lin 21
如果我正确理解你,你可以将它包装在一个函数中.
考虑将这个(愚蠢的)平方函数实现为宏:
(defmacro square [x]
(list * x x))
Run Code Online (Sandbox Code Playgroud)
如你所知,直接将它作为arg传递是行不通的:
user=> (map square [1 2 3 4 5])
java.lang.Exception: Can't take value of a macro: #'user/square (NO_SOURCE_FILE:8)
Run Code Online (Sandbox Code Playgroud)
但是将它包装在一个函数中就可以了:
user=> (map #(square %) [1 2 3 4 5])
(1 4 9 16 25)
Run Code Online (Sandbox Code Playgroud)
或者(并且更加邪恶),您可以制作另一个宏来进行更通用的包装:
(defmacro make-fn [m]
`(fn [& args#]
(eval `(~'~m ~@args#))))
user=> (map (make-fn square) [1 2 3 4 5])
(1 4 9 16 25)
Run Code Online (Sandbox Code Playgroud)
我坚持使用正常的函数包装,并跳过最后一次破解!:)