2012-12-13 122 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