我很好奇当Clojure文件编译成类文件时实际上会发生什么。AOT编译文件时,宏的处理方式是什么?
在REPL评估和编译之间有什么区别吗?
我很好奇当Clojure文件编译成类文件时实际上会发生什么。AOT编译文件时,宏的处理方式是什么?
在REPL评估和编译之间有什么区别吗?
(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”。以上情况通过上面的图片有所解释。读者首先通过重新构造扩展源代码,然后评估参数。函数首先评估参数,然后评估主体。编译成类将落在大约评估步骤附近。