【问题标题】:Macros can't return anonymous functions? Clojure宏不能返回匿名函数? Clojure
【发布时间】:2016-12-06 01:54:56
【问题描述】:

我有以下宏:

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

【问题讨论】:

    标签: clojure macros


    【解决方案1】:

    我只需要在像这样评估内部变量时转义函数:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 这是真的。我的特殊情况比我提供的示例更复杂,需要在编译时进行解释。谢谢!
      • @JasonBasanese,请以简单明了的方式说明您要解决的实际问题。如果您只是说“我的特殊情况更复杂”,它对任何人都没有任何好处。如果它更复杂,那么你的问题应该更复杂。这样你会得到更好的答案,因为我们不必猜测最终目标是什么。
      • 我很抱歉造成混乱。我将澄清我的问题,包括不使用宏不是一种选择。
      • @JasonBasanese,不,那 not 根本没有提供任何清晰度。您说“我的特殊情况比我提供的示例更复杂”。它在哪些方面更复杂?换句话说,你还没有告诉我们什么?
      • 看你好奇,我补充了原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多