我很想知道将clojure文件编译成类文件时实际发生了什么。当文件被编译时,宏会发生什么?
repl评估和编译之间有什么区别吗?
答案 0 :(得分:2)
关于宏缩略图评论是对的。 Reader allways首先在宏之前评估宏,比如这样。
这就是为什么有些事情可以像宏一样完成,而不是作为一个功能。
示例:or
是一个宏,原因很简单。让我们看看如何将or
定义为宏或函数。
(defmacro or
([] nil)
([x] x)
([x & next]
`(let [or# ~x]
(if or# or# (or ~@next)))))
(defn or
([] nil)
([arg] arg)
([arg & args]
(if arg arg (or args))
现在,如果您尝试用(or 1 (println :foo))
调用这两个函数,宏将只返回1,函数将返回1并打印“:foo”。
上图说明了这一点。读者首先通过重构源代码来扩展源代码,然后评估参数。函数首先评估参数然后评估正文。
编译到一个类将围绕评估步骤。