¿Compilando Clojure?
compilation (2)
¿Por qué no usas Leiningen ? Es mucho más fácil de usar que compilar el código manualmente. Puedes usar mi artículo al respecto como introducción ...
Me siento un poco tonto aquí, pero no puedo hacer que Clojure Hello World se compile.
Estructura de directorios:
hello-world/
clojure-1.1.0.jar
build/
classes/
src/
test/
hello.clj
hola.clj:
(ns test.hello
(:gen-class))
(defn -main [& args]
(println "Hello" (nth args 0)))
Interacción:
$ 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
Así que puedo cargar y llamar al archivo desde el REPL, pero no se compila.
Según clojure.org , las necesidades de compilación.
- el espacio de nombres debe coincidir con la ruta de acceso relativa del archivo classpath - verificar
- * compile-path * debe estar en el classpath - check
- : gen-class argumento a la forma ns - cheque
Encontré esta publicación de hace un año , por lo que sé, estoy haciendo exactamente lo mismo, pero no funciona.
¿Qué me estoy perdiendo?
Sistema: OS X 10.6, Java 1.6.0, Clojure 1.1
Lo tengo, hay un cuarto requisito:
- * compile-path * se resuelve en relación con el directorio de trabajo de las JVM, normalmente el directorio donde se inicia java. O por REPL:
(System/getProperty "user.dir")
,
Así que esto funciona:
user=> (set! *compile-path* "build/classes")
"build/classes"
user=> (compile ''test.hello)
test.hello