【问题标题】:Can Clojure generate function by macro?Clojure 可以通过宏生成函数吗?
【发布时间】:2014-05-08 12:49:44
【问题描述】:

我正在尝试通过宏生成 fn。但我遇到了一个奇怪的问题。 代码在这里。

(defmacro test2 [lmk]
   (fn [lmk2] (println lmk lmk2)))
((test2 12) 13) ;;----->Error
(defmacro test3 []
   (fn [lmk] (println lmk)))
((test3) 12) ;;----->OK
(defmacro test4 []
   `(fn [lmk] (println lmk)))
((test4) 12) ;;----->Error

我知道 defn 可以很好地工作。我只是想知道为什么我不能在这里使用 defmacro。以及为什么 test3 工作得很好,但是 test2 失败了。

【问题讨论】:

  • 你得到什么错误?

标签: macros clojure


【解决方案1】:

在test2中,在编译之前,会调用test2宏(lmk还没有被编译或求值)——因为没有语法引用,这实际上会求fn形式并返回一个函数对象(lmk关闭超过)。因此,您将表单 (fn-object 13) 传递给了编译器,我认为这是一条意想不到的路径(不确定究竟是什么)。有趣的是,这有效:

(def f (test2 12))
(f 13)

在 test4 中,语法引号将导致每个 lmk 符号在命名空间中被解析,因此这就是错误的来源。你真的想对这些进行自动生成:

(defmacro test4 [] 
  `(fn [lmk#] (println lmk#)))

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 1970-01-01
    • 2011-12-12
    • 2016-10-28
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2013-05-16
    相关资源
    最近更新 更多