我正在尝试通过宏生成 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) 传递给compiler,我认为这正在走一条意想不到的道路(不确定那到底是什么)。有趣的是,这有效:
(def f (test2 12))
(f 13)
在 test4 中,语法引用将导致每个 lmk 符号在命名空间中解析,因此这就是该错误的根源。你真的想要对这些进行 autogensyming:
(defmacro test4 []
`(fn [lmk#] (println lmk#)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)