Clojure 新手 - 命名空间问题

4

我正在学习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的调用,并执行以下操作:

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

然后我就可以调用它。为什么呢?我猜是与命名空间有关,但是阅读相关资料后我还是不明白。
A
1个回答

7

myFunc符号尚未定义,因此main函数找不到它。如果将myFunc的定义移到main函数上方,则可以解决问题。


有趣的是,这确实有效。我在哪里可以阅读相关信息?是否有前向声明的等效物? - AlMcLean
1
你可以使用“declare”来创建前置声明:(declare myFunc)。另外请注意,驼峰式写法在Clojure函数名称中不是常规写法,破折号才是常规写法。 - Kyle Burton
这些链接可能会解释原因: https://groups.google.com/forum/?fromgroups=#!topic/clojure/w0GIdSCNieE 和 http://news.ycombinator.com/item?id=2467359 - bmaddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接