2010-06-26 4 views
16

Je me sens un peu bête ici, mais je n'arrive pas à compiler Clojure Hello World.Compilation de Clojure?

Structure du répertoire:

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))) 

Interaction:

$ 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 

donc je peux charger et appeler le fichier à partir du REPL, mais il n » t compiler.

Selon clojure.org, la compilation a besoin

  • espace de noms doit correspondre chemin du fichier classpath-parent - vérifier
  • * compilation chemin * doit être sur le chemin de classe - vérifier
  • : Argument gen-classe la forme de ns - vérifier

J'ai trouvé this post from a year back, autant que je peux dire que je fais exactement la même chose, mais cela ne fonctionne pas.

Qu'est-ce qui me manque?

Système: OS X 10.6, Java 1.6.0, Clojure 1.1

+0

Il semblerait que je ne puisse pas accepter ma propre réponse, alors je vais devoir laisser la question ouverte jusqu'à ce que quelqu'un d'autre intervienne. –

+0

Il est également important de noter que vous avez rarement besoin de compiler AOT code Clojure. Le code de Clojure fonctionnera très bien sans être compilé, et c'est ainsi que vous devriez l'exécuter. Certaines fonctionnalités d'interopérabilité Clojure Java spécifiques * requièrent * que votre code soit compilé AOT, mais si vous n'utilisez pas ces fonctionnalités, ne vous embêtez pas à compiler votre code. Si vous voulez un fichier exécutable, vous pouvez juste AOT compiler un fichier principal avec juste une fonction -main pour exécuter l'application. Cependant, http://www.assembla.com/spaces/clojure/tickets/315-add-support-for-running--main-namespace-from-clojure-main-without-aot – Rayne

Répondre

11

Pourquoi ne pas utiliser Leiningen? Il est beaucoup plus facile de l'utiliser que de compiler du code manuellement. Vous pouvez utiliser my article à ce sujet comme introduction ...

+0

Je l'ai utilisé brièvement pour télécharger des dépendances pour des projets externes, mais jusqu'ici pas regardé dans la façon de l'utiliser comme un outil de construction. Merci pour le lien, je vais vérifier. –

+0

Belle vue d'ensemble, merci pour l'article.Probablement sur le temps je commence à utiliser un outil de construction de toute façon :) –

+0

Leiningen ne m'aide pas: $ lein test Impossible de trouver le projet.clj, qui est nécessaire pour le test – mcandre

20

a obtenu, il y a une quatrième condition:

  • * compilation chemin * est résolu par rapport aux JVMs répertoire de travail, normalement le répertoire où Java est démarré. Ou par REPL: (System/getProperty "user.dir"),

ceci marche:

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

Modifié l'explication, le premier était faux. Le correctif est le même. –

+4

Pour moi, (set! * Compile-path * ".") Est nécessaire pour compiler les CLJ dans le répertoire courant. – mcandre

+0

+1 Cela m'a aidé ... merci! – OscarRyz