macros - Clojure可以通过宏生成函数吗?

标签 macros clojure

我正在尝试通过宏生成 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/

相关文章:

clojure - 有哪些编写良好的开源 Clojure 应用程序(不是库)?

CSS 类 "macro"

C++宏定义相互依赖的类

macros - 如何在宏调用中使用参数?

visual-studio-2010 - Visual Studio 通过宏启用调试异常

clojure - 有人可以用简单的术语解释 Clojure 的 unquote-splice 吗?

maven - leiningen项目中使用maven的 "LATEST"关键字

c - 我们如何编写 C 宏来将强制转换插入函数调用?

clojure - 为什么 Clojure 的原子交换!返回新值?

asynchronous - Clojure 交换!原子并行执行