2011-10-10 92 views
2

是否可以在不進入REPL的情況下編譯clojure源代碼?如果一個大項目在那裏,那麼它是不可能的手動編譯每個程序&然後使它的jar文件,如果我想編譯和獲取類文件的一些指令使軟件?是否有可能在不進入REPL的情況下編譯clojure源代碼?

+1

爲什麼你需要使用'make',不能,例如,使用['leiningen'] (https://github.com/technomancy/leiningen)或'maven'? – skuro

+0

@skuro [http:// stackoverflow。com/questions/7686452/how-to-build-executable-jar-from-clojure-code-with-a-main-function-of-java-in-on]這是在windows上配置lein的方法,遵循相同的我無法正確配置它的指示集。 – vikbehal

+0

即使在'make'中,你也必須遵循相同的步驟,比如提供'-main'等功能。只有幾乎沒有其他clojure開發者使用這樣的工具集,而有很多快樂的leiningen用戶。我建議你發佈你的leiningen配置並尋求幫助。 – skuro

回答

6

爲了理解這些系統中有多少個可以工作,下面是一些沒有repl的編譯代碼的最低代碼。

假設你有一些類生成代碼:

hello.clj:

(ns hello 
    (:gen-class 
    :methods [[sayHi [] String]])) 

(defn -sayHi [this] 
    (println "hello world")) 

你可以建立 「的Makefile」 出的Clojure代碼

compile.clj:

(set! *compile-path* "./") 
(compile 'hello) 

然後,您只需將您的代碼作爲腳本調用即可。

$ java -cp ~/dj/lib/clojure.jar:./ clojure.main compile.clj 
$ ls 
compile.clj hello.clj   hello$loading__4505__auto__.class 
hello.class hello__init.class hello$_sayHi.class 

現在你的代碼被編譯,你可以像任何其他類文件訪問:

$ java -cp ~/dj/lib/clojure.jar:./ clojure.main 
Clojure 1.3.0 
user=> (import 'hello) 
hello 
user=> (.sayHi (hello.)) 
"hello world" 
user=> 
+0

是否可以在不進入REPL的情況下調用hello.clj?像__java -cp clojure.jar clojure.main -i「hello.clj」-e'(hello)'__ – vikbehal

+0

是的,只需使用與編寫編譯腳本相同的技術即可。用你想運行的代碼創建一個clojure文件,然後運行$ java -cp clojure.jar clojure.main runhello.clj – bmillare

+0

在文件中編寫**(import'hello)(.sayHi(hello。))**,像你說的沒有幫助,沒有輸出,沒有錯誤 – vikbehal

2

我有一個使用多種語言的大型項目,並使用make作爲啓動所有其他組件的粘合劑,並且這種方法效果很好。你可能做得很好,可以打電話給Maven或Leiningen,而不是使用make來重新創建它們。

如果你正在尋找一個替代leiningen,因爲它不是爲你工作,或者你只是想使用別的東西,那麼也許你會喜歡Clojure Maven plugin

個人而言,我不能說Leiningen的太高這是我個人的選擇,雖然互聯網上有很多人,但值得探索其他選擇。

3

是的 - 你當然可以在不使用REPL的情況下編譯和運行Clojure代碼。使用load function在運行時

  • 加載Clojure的代碼:

    一些選項來做到這一點。這將讀取,編譯和評估指定的Clojure代碼,而不涉及任何REPL。

  • 包一切,因爲使用Leiningen或Maven或任何其他合適的構建工具一個.jar - 那麼你可以運行你的代碼作爲一個普通的Java應用程序,Clojure的代碼將被編譯和執行時
  • 該.jar運行
  • 從Java啓動代碼 - 編寫一個啓動Clojure編譯器的Java應用程序,直接編譯並執行Clojure代碼。如果您將Clojure用作更大的Java應用程序的組件,這可能是一個明智的方法。
+0

如何才能我們在運行時加載一個沒有任何REPL的文件?我們不需要這樣做嗎? __user =>(加載文件「filename.clj」)__? – vikbehal

+0

您可以從其他代碼執行此代碼,可能基於某種其他形式的用戶輸入(例如,選擇Clojure文件以在GUI中運行)。 – mikera

相關問題