我正在尝试通过宏生成 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却失败了。
最佳答案
在 test2 中,在编译之前,将调用 test2 宏(lmk 尚未编译或评估) - 因为没有语法引用,这实际上会评估 fn 形式并返回一个函数对象(lmk 关闭)超过)。因此,您将表单 (fn-object 13) 传递给编译器,我认为这是一条意外的路径(不确定到底是什么)。有趣的是,这有效:
(def f (test2 12))
(f 13)
在 test4 中,语法引用将导致每个 lmk 符号在命名空间中解析,因此这就是该错误的根源。您确实希望对这些进行 autogensyming:
(defmacro test4 []
`(fn [lmk#] (println lmk#)))
关于macros - Clojure可以通过宏生成函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23542241/