2012-05-02 28 views
12

我對Clojure還是比較陌生的,所以我很抱歉如果這是一個完全新手的問題,但我無法在網上找到足夠的答案。如何使用leiningen在其他文件中引用函數?

基本上,我的問題是,任何時候我嘗試運行我的項目,我得到這樣一個錯誤:

Exception in thread "main" java.lang.RuntimeException: java.io.FileNotFoundException: Could not locate greeter__init.class or greeter.clj on classpath: 

在這種情況下,greeter.clj是在同一個目錄中的文件的項目包含我的主要功能。

爲了便於說明,我已經創建了一個具有這樣的目錄樹的一個項目:

enter image description here

我對core.clj代碼如下:

(ns omg.core 
(require [greeter])) 

(defn -main[] (greet)) 

我的代碼for greeter.clj是:

(ns greeter) 

(defn greet [] println("Hello world")) 

每當我輸入lein run -m omg.core我得到上面提到的例外。我究竟做錯了什麼?

回答

16

在錯誤的水平

(ns omg.greeter) 

在命名空間中的名字命名空間迎賓它對應於路徑的文件夾,以便使用該文件中 /src/omg/greeter.clj該文件應包含omg.greeter命名空間。如果你想擁有它只是叫greeter然後使用require需要拼出你調用的函數的命名空間,在這種情況下,這將是(omg.greeter/greet)其向下移動一個文件夾

。由於這是一個痛苦,use函數需要一個名稱空間並將其所有函數添加到當前名稱空間。這是更有選擇性的另一種方法是使用一個要求:在命名空間定義見選項

(ns omg.core 
    (require [omg.greeter :refer :all])) 

(ns omg.core 
    (require [omg.greeter :refer [greet]])) 

大多數人把命名空間要求納入ns呼叫在該文件的頂部。

http://clojure.org/namespaces快速閱讀希望能幫助

+1

亞瑟,非常感謝你的答案和你的解釋。對此,我真的非常感激。我通過剝離require並在其中添加(使用omg.greeter)來實現它。 –

相關問題