简单标题建议:
为什么我必须
(require 'clojure.edn)
以便使用例如:
(clojure.edn/read-string "9")
为什么我可以立即调用:
(clojure.string/join (range 4) "-")
答案 0 :(得分:8)
Clojure程序从“主”命名空间(通常是project-name.core)的顶部开始,并从上到下评估每个表单。这在程序启动时以及在调用任何“主”函数之前发生。
当评估require
表达式时,它会跳转到该命名空间并在那里执行相同的操作。如果遇到需求,则会递归这些命名空间的分支,根据需要递归加载每个命名空间。
因此,如果您没有明确声明您的命名空间需要另一个命名空间,那么您将需要加载其依赖项的其他namspace的顺序。有时它会起作用,有时候你的远程依赖项的评估顺序无关的更改会破坏你的代码。
所以请,请...声明自己的要求!
答案 1 :(得分:1)
(刚刚开始clojure
)我默认加载了以下ns
user=> (pprint (map #(.getName %) (all-ns)))
(clojure.edn
clojure.core.server
clojure.java.io
clojure.java.shell
clojure.core.protocols
clojure.string
clojure.java.browse
clojure.pprint
clojure.uuid
clojure.core
clojure.main
user
clojure.java.javadoc
clojure.repl
clojure.walk
clojure.instant)
在您所在的命名空间中,clojure.edn
似乎无法加载