2010-06-26 5 views
16

Czuję się tutaj trochę głupio, ale nie mogę zdobyć Clojure Hello World do kompilacji.Kompilacja Clojure?

Struktura katalogów:

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

Interakcje:

$ 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 

Więc mogę załadować i wywołać plik z REPL, ale nie robi” t skompilować.

Według clojure.org, kompilacja musi

  • nazw musi odpowiadać ścieżce klasy względne ścieżki pliku - sprawdź
  • * kompilacji ścieżki * musi być na ścieżce klasy - sprawdź
  • : gen klasy argumentu ns forma - sprawdź

Znalazłem this post from a year back, o ile mogę powiedzieć, że robię dokładnie to samo, ale to nie działa.

Czego mi brakuje?

System: OS X 10.6, Java 1.6.0, Clojure 1,1

+0

Wygląda na to, że nie mogę przyjąć mojej własnej odpowiedzi, więc będę musiał zostawić to pytanie otwarte, dopóki ktoś inny nie zadzwoni. –

+0

Należy również pamiętać, że rzadko trzeba AOT skompilować kod Clojure. Kod Clojure będzie działał dobrze bez kompilacji, i to jest sposób, w jaki powinieneś go uruchomić. Niektóre konkretne funkcje współdziałania Java Clojure * wymagają *, aby twój kod był skompilowany AOT, ale jeśli nie korzystasz z tych funkcji, nie przejmuj się kompilowaniem kodu. Jeśli chcesz wykonać plik wykonywalny, możesz po prostu skompilować plik główny za pomocą funkcji -nain, aby uruchomić aplikację. Jednak http://www.assembla.com/spaces/clojure/tickets/315-add-support- for-running--main-namespace-from-clojure-main- without- – Rayne

Odpowiedz

11

Dlaczego nie używasz Leiningen? O wiele łatwiej jest z niego korzystać, niż ręcznie skompilować kod. Możesz użyć numeru my article jako wprowadzenia ...

+0

Użyłem go krótko do pobrania zależności dla zewnętrznych projektów, ale do tej pory nie szukałem sposobu użycia go jako narzędzia do budowania. Dzięki za link, sprawdzę to. –

+0

Niezły przegląd, dzięki za artykuł.Prawdopodobnie o czasie zacząłem używać narzędzia budowania i tak :) –

+0

Leiningen nie pomaga mi: $ lein test Nie można znaleźć project.clj, który jest potrzebny do testu – mcandre

20

Rozumiem, tam czwarty wymóg:

  • * kompilacji * ścieżka zostanie rozwiązany w stosunku do katalogu JVMs pracuje normalnie katalog, w którym uruchomiono java. Lub REPL: (System/getProperty "user.dir"),

Tak to działa:

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

Zmodyfikowano objaśnienie, pierwsze było źle. Poprawka jest taka sama. –

+4

Dla mnie (zestaw! * Ścieżka kompilacji * ".") Jest niezbędna do kompilowania bibliotek CLJ w bieżącym katalogu. – mcandre

+0

+1 To mi pomogło ... dziękuję! – OscarRyz