宏无法返回匿名函数? Clojure的

时间:2016-12-06 01:54:56

标签: clojure macros

我有以下宏:

(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循环运行一次。

2 个答案:

答案 0 :(得分:3)

我只需要在评估内部变量时转义函数,如下所示:

(defmacro anon-mac [value] `#(+ % ~value))

答案 1 :(得分:3)

不确定您使用的是什么,但是如果您想使用某个功能,您可能会发现partial有用,因为它提供了您所追求的行为。

(defn anon-partial [val] (partial + val))
((anon-partial 1) 1) ;;=> 2

clojuredocs.org处还有partial的一些有用示例。