次の無意味な*.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はコンパイル時/実行時の区別を曖昧にする」ことと関係がありますか?