2010-06-26 13 views
16

Qui mi sento un po 'sciocco, ma non riesco a compilare Clojure Hello World.Compilare Clojure?

struttura di directory:

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

Interazione:

$ 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 

così posso caricare e chiamare il file dal REPL, ma doesn' t compilare.

Secondo clojure.org, la compilazione deve

  • namespace deve corrispondere il percorso del file classpath-relativa - verificare
  • * compilare-path * deve essere nel classpath - controllare
  • : argomento gen-classe il modulo ns - check

Ho trovato this post from a year back, per quanto posso dire che sto facendo esattamente lo stesso, ma non funziona.

Cosa mi manca?

sistema: OS X 10.6, Java 1.6.0, Clojure 1.1

+0

Sembra che non possa accettare la mia risposta, quindi dovrò lasciare la domanda aperta fino a quando qualcun altro interverrà. –

+0

È anche importante notare che raramente bisogno di AOT compilare codice Clojure. Il codice Clojure funzionerà perfettamente senza essere compilato, e questo è il modo in cui dovresti eseguirlo. Alcune specifiche funzionalità di interoperabilità Clojure Java in realtà * richiedono * che il codice venga compilato AOT, ma se non si utilizzano tali funzioni, non preoccuparsi di compilare il codice. Se si desidera un jar eseguibile, è possibile semplicemente AOT compilare un file principale con solo una funzione -main per eseguire l'applicazione. Tuttavia, http://www.assembla.com/spaces/clojure/tickets/315-add-support-for-running--main-namespace-from-clojure-main-without-aot – Rayne

risposta

11

Perché non si utilizza Leiningen? È molto più facile da usare, piuttosto che compilare il codice manualmente. Puoi usare my article come introduzione ...

+0

L'ho usato brevemente per scaricare le dipendenze per progetti esterni, ma finora non ho visto come usarlo come strumento di costruzione. Grazie per il link, lo controllerò. –

+0

Bella panoramica, grazie per l'articolo.Probabilmente ora inizio a utilizzare uno strumento di costruzione :) –

+0

Leiningen non mi aiuta: $ lein test Impossibile trovare project.clj, che è necessario per il test – mcandre

20

Capito, c'è una quarta requisito:

  • * compilare-path * si risolve relativi alle JVM directory di lavoro, normalmente la directory in cui viene avviato java. O per REPL: (System/getProperty "user.dir"),

Così funziona:

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

Modificata la spiegazione, la prima era sbagliata. La correzione è la stessa. –

+4

Per me, (set! * Compile-path * ".") È necessario compilare CLJ nella directory corrente. – mcandre

+0

+1 Questo mi ha aiutato ... grazie! – OscarRyz