为什么必须要求一些原生的clojure命名空间,而有些则不需要

时间:2016-03-24 20:47:53

标签: clojure

简单标题建议:

为什么我必须

(require 'clojure.edn)

以便使用例如:

(clojure.edn/read-string "9")

为什么我可以立即调用:

(clojure.string/join (range 4) "-")

2 个答案:

答案 0 :(得分:8)

Clojure程序从“主”命名空间(通常是project-name.core)的顶部开始,并从上到下评估每个表单。这在程序启动时以及在调用任何“主”函数之前发生。

当评估require表达式时,它会跳转到该命名空间并在那里执行相同的操作。如果遇到需求,则会递归这些命名空间的分支,根据需要递归加载每个命名空间

因此,如果您没有明确声明您的命名空间需要另一个命名空间,那么您将需要加载其依赖项的其他namspace的顺序。有时它会起作用,有时候你的远程依赖项的评估顺序无关的更改会破坏你的代码

所以请,请...声明自己的要求!

答案 1 :(得分:1)

在repl中的

(刚刚开始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似乎无法加载