Компиляция Clojure?
Я чувствую себя немного глупо, но не могу заставить 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, для компиляции нужны
- пространство имен должно соответствовать пути к файлу, указанному относительно пути к классу - проверьте
- * путь компиляции * должен быть на пути к классам - проверьте
- : аргумент gen-класса для формы ns - проверка
Я нашел этот пост год назад, насколько я могу судить, я делаю то же самое, но он не работает.
Что мне не хватает?
Система: OS X 10.6, Java 1.6.0, Clojure 1.1
2 ответа
Решение
Почему вы не используете Leiningen? Гораздо проще его использовать, чем компилировать код вручную. Вы можете использовать мою статью об этом как введение...
Понял, есть четвертое требование:
- * compile-path * разрешается относительно рабочего каталога JVM, обычно это каталог, в котором запускается java. Или по REPL:
(System/getProperty "user.dir")
,
Так что это работает:
user=> (set! *compile-path* "build/classes")
"build/classes"
user=> (compile 'test.hello)
test.hello