我有以下宏:
(defmacro anon-mac [value]
#(+ value 1))
我希望这样做:
((anon-mac 1) 1) ;=> 2
但是我收到了这个错误:
IllegalArgumentException No matching ctor found for class user$anon_mac$fn__10767 clojure.lang.Reflector.invokeConstructor (Reflector.java:163)
我该怎么做才能让这个宏返回一个按照我的预期工作的匿名函数?
答案必须是宏。看到我的问题涉及宏返回匿名函数的能力
为什么答案必须是宏?在我的情况下,这是因为我不希望在编译时将此转换多次调用。如果我在一个调用它200次的for循环中进行此转换,则使用函数转换将运行200次。然而,当看到宏编辑代码本身时,它只会为for循环运行一次。
答案 0 :(得分:3)
我只需要在评估内部变量时转义函数,如下所示:
(defmacro anon-mac [value] `#(+ % ~value))
答案 1 :(得分:3)
不确定您使用的是什么,但是如果您想使用某个功能,您可能会发现partial有用,因为它提供了您所追求的行为。
(defn anon-partial [val] (partial + val))
((anon-partial 1) 1) ;;=> 2
在clojuredocs.org处还有partial
的一些有用示例。