2013-10-14 34 views
3

我有以下无意义的*.clj文件:为什么编译`* .clj`源程序也会执行代码?

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

(println "foo") 

(defn -main [& args] 
    nil) 

当它与下面的Ant目标编译到*.classclojure.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模糊编译时/运行时区分”的事情?

回答

7

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

把你不想运行的任何东西放到init函数中,然后包含一个函数调用main(或者你的代码开始的地方)

相关问题