编译clojure文件涉及哪些步骤?

时间:2014-03-11 06:29:44

标签: clojure

我很想知道将clojure文件编译成类文件时实际发生了什么。当文件被编译时,宏会发生什么?

repl评估和编译之间有什么区别吗?

1 个答案:

答案 0 :(得分:2)

关于宏缩略图评论是对的。 Reader allways首先在宏之前评估宏,比如这样。

Evaluation Cycle of Clojure

这就是为什么有些事情可以像宏一样完成,而不是作为一个功能。 示例: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”。

上图说明了这一点。读者首先通过重构源代码来扩展源代码,然后评估参数。函数首先评估参数然后评估正文。

编译到一个类将围绕评估步骤。