2012-12-13 89 views
4

我在學習Clojure,至今我無法理解這個我敢肯定基本可笑的小難題。Clojure新手 - 命名空間的煩惱

我有這個文件:

(ns cloapp.core 
    (:gen-class)) 

(defn -main 
    "I don't do a whole lot ... yet." 
    [& args] 
    (println "Hello, World!") 
    (println "Well Hi there, im a string !") 
    (println "Why wont this work !") 
    (myFunc "Hiya")) 

(defn myFunc [aVar] 
    (println aVar)) 

如果我試着和運行此,

lein run 

它抱怨說:

Caused by: java.lang.RuntimeException: Unable to resolve symbol: myFunc in this context 

但如果我刪除調用myFunc from main和do,

lein repl 
cloapp.core=> (myFunc "Hiya !") 
Hiya ! 
nil 
cloapp.core=> 

然後我可以打電話給它。爲什麼是這樣 ?我假設這是與命名空間有關,但閱讀它我不能解決它。

一個

回答

7

的myFunc的符號尚未確定,所以主無法找到它。如果你將myFunc的定義移動到main的上面,那麼它將起作用。

+0

有趣的是,這確實有效。我在哪裏可以讀到這個?是否有相當於前向聲明? – AlMcLean

+1

您可以使用'declare'來創建前向聲明:(聲明myFunc)。還要注意,駱駝案例並不是常規的clojure函數名稱,破折號是常規的。 –

+0

好的,沒問題 - 謝謝你的擡頭。 – AlMcLean