我有以下非感性*.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模糊编译时/运行时区别”有关?
答案 0 :(得分:7)
Clojure中的编译单元是顶级s-expression ,它在文件加载时被读取,扩展,评估并经常存储在命名空间中。整个文件没有单独的编译阶段。这样做允许您编写定义其他功能的功能,类型,DSL等,并且是宏系统的构建块。
把你不想要的东西放到init函数中,然后在main(或代码启动的地方)包含一个函数调用