gpt4 book ai didi

clojure - 为什么 Clojure 在 AOT 编译期间评估表单?

转载 作者:行者123 更新时间:2023-12-02 15:14:40 26 4
gpt4 key购买 nike

我已经建立了一个小项目:

project.clj:

(defproject testing-compilation "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.8.0"]]

;; this is important!
:aot :all)

src/core.clj

(ns testing-compilation.core)

(def x (do
(println "Print during compilation?")
1))

然后,当我在项目目录中进行 leincompile 时,我会看到打印的输出:

$ lein compile
Compiling testing-compilation.core
Print during compilation?

我的问题是:为什么 clojure 在 AOT 编译期间评估顶级表单?难道不应该在程序启动时评估它们吗?

供引用,Common Lisp默认情况下不评估表单并且 provides ability to tune this behaviour 。 Clojure 中有类似的东西吗?如果没有,Clojure 文档是否明确说明了这种行为?

UPD:表单也在启动时进行评估。

指定主命名空间并编写打印 Hello, world! 的主函数后,我这样做了:

$ lein uberjar
Compiling testing-compilation.core
Print during compilation?
Created testing-compilation-0.1.0-SNAPSHOT.jar
Created testing-compilation-0.1.0-SNAPSHOT-standalone.jar

$ java -jar target/testing-compilation-0.1.0-SNAPSHOT-standalone.jar
Print during compilation?
Hello world!

最佳答案

AOT过程的第一部分是找到包含主命名空间的文件并通过evaluating加载它。从上到下的每一个表情。

其中一些表达式将是 require 表达式,它们将具有加载其他命名空间的效果,从而递归地加载更多命名空间。

其他将是 defn 表达式,它们将具有启动编译器并生成类文件的效果。生成一个类文件for each function

其他表达式可能会进行一些计算,然后执行生成类文件的操作,因此给它们运行的​​机会很重要。这是一个虚构的示例:

user> (let [precomputed-value (reduce + (range 5))]
(defn funfunfun [x]
(+ x precomputed-value)))
#'user/funfunfun
user> (funfunfun 4)
14

可以设计一个在开始时不评估顶级表单的 Lisp,或者正如您提到的,将其设为可选。就 Clojure 而言,我们决定在 AOT 和“非 AOT”加载中保持单一的评估策略,以便程序始终以相同的方式运行,无论它们是如何编译的。这些是其他人做出的个人设计选择,因此我无法在这里谈论他们的动机。

关于clojure - 为什么 Clojure 在 AOT 编译期间评估表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38618173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com