gpt4 book ai didi

clojure - 为什么编译 `*.clj` 源代码也会执行代码?

转载 作者:行者123 更新时间:2023-12-02 10:43:31 24 4
gpt4 key购买 nike

我有以下无意义的 *.clj 文件:

(ns bar.zar.Foo
(:gen-class :main true))

(println "foo")

(defn -main [& args]
nil)

使用以下 Ant 目标将其编译为 *.class (clojure.lang.Compile) 时:

<target name="compile-clojure" description="Compile Clojure sources." depends="resolve">
<mkdir dir="${cljbuild.dir}"/>
<java classname="clojure.lang.Compile"
failonerror="true"
fork="true">
<classpath refid="compile.classpath"/>
<sysproperty key="clojure.compile.path" value="${cljbuild.dir}"/>
<arg value="${project.MainClass.name}"/>
</java>
</target>

我在输出中看到:

 [java] Compiling bar.zar.Foo to /home/[ommitted]/build
[java] foo

也就是说,(println "foo") 表达式是在编译期间计算的。这是为什么?它与“Lisp 模糊了编译时/运行时区别”这件事有关吗?

最佳答案

Clojure 中的编译单元是顶级 s 表达式,它会在文件加载时被读取、扩展、求值,并且通常存储在命名空间中。整个文件没有单独的编译阶段。这样做允许您编写定义其他函数、类型、DSL 等的函数,并且是宏系统的构建 block 。

将您不想运行的任何内容放入 init 函数中,然后从 main (或代码开始的任何位置)调用该函数

关于clojure - 为什么编译 `*.clj` 源代码也会执行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19371131/

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