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

Ant*_*ald 5 clojure

简单的标题是:

我为什么要这样做

(require 'clojure.edn)
Run Code Online (Sandbox Code Playgroud)

为了使用例如:

(clojure.edn/read-string "9")
Run Code Online (Sandbox Code Playgroud)

为什么我可以立即调用:

(clojure.string/join (range 4) "-")
Run Code Online (Sandbox Code Playgroud)

Art*_*ldt 8

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

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

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

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

  • 是! 并且更可能将它放在(:require ...)部分顶部的ns形式中.喜欢这个`[clojure.string:参考[ends-with?]]`你不需要为clojure.core做这个,尽管其他一切都是一个好习惯,可以帮助那些在未来几年里为你的代码工作的人生活更幸福. (2认同)

bir*_*der 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)
Run Code Online (Sandbox Code Playgroud)

无论您在哪个命名空间中,clojure.edn似乎都没有被加载