编译Clojure?

时间:2010-06-26 11:17:57

标签: clojure compilation

我觉得这里有点傻,但我无法让Clojure Hello World编译。

目录结构:

hello-world/
  clojure-1.1.0.jar
  build/
    classes/
  src/
    test/
      hello.clj

hello.clj:

(ns test.hello
  (:gen-class))

(defn -main [& args]
  (println "Hello" (nth args 0)))

相互作用:

$ cd hello-world
[hello-world]$ java -cp ./clojure-1.1.0.jar:./build/classes:./src clojure.main
Clojure 1.1.0
user=> (require 'test.hello)
nil
user=> (test.hello/-main "there")
Hello there
nil
user=> (compile 'test.hello)
java.io.IOException: No such file or directory (hello.clj:2)
user=> *compile-path*
"classes"
user=> (doseq [p (.split (System/getProperty "java.class.path") ":")] (println p))
./clojure-1.1.0.jar
./build/classes
./src
nil

所以我可以从REPL加载并调用该文件,但它不能编译。

根据clojure.org,编译需要

  • 命名空间必须与类路径相关的文件路径匹配 - 检查
  • * compile-path *必须在类路径上 - 检查
  • :ns表格的gen-class参数 - 检查

我发现this post from a year back,据我所知,我做的完全一样,但它不起作用。

我错过了什么?

系统:OS X 10.6,Java 1.6.0,Clojure 1.1

3 个答案:

答案 0 :(得分:21)

知道了,还有第四项要求:

  • * compile-path *是相对于JVM工作目录解析的,通常是启动java的目录。或者通过REPL:(System/getProperty "user.dir")

这样可行:

user=> (set! *compile-path* "build/classes")     
"build/classes"
user=> (compile 'test.hello)
test.hello

答案 1 :(得分:11)

为什么不使用Leiningen?使用它比使用手动编译代码要容易得多。您可以使用my article作为介绍......

答案 2 :(得分:0)

运行clojure文件

clojure filename.clj