ns的参数是什么?文件说了些什么,但不清楚(对我来说,至少)
my-new-namespace=> (doc ns)
-------------------------
clojure.core/ns
([name docstring? attr-map? references*])
Macro
Sets *ns* to the namespace named by name (unevaluated), creating it
if needed.
...the rest of the documentation was not copied
混淆来自使用命名空间的所有其他函数:
user=> (find-ns 'my-new-namespace)
nil
user=> (remove-ns 'my-new-namespace)
nil
user=> (create-ns 'my-new-namespace)
#<Namespace my-new-namespace>
user=> (ns 'my-new-namespace)
java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to clojure.lang.Symbol (NO_SOURCE_FILE:26)
user=> (ns my-new-namespace)
nil
my-new-namespace=>
find-ns, create-ns, remove-ns
引用my-new-namespace
引用,而ns
引用my-new-namespace
不加引号
那么,这笔交易是什么?为什么有些人会得到一个引用的表格而其他人会得到my-new-namespace
在每种情况下,my-new-namespace
是什么?
答案 0 :(得分:3)
ns是一个宏,如果引用名称可以省去麻烦:
user> (macroexpand '(ns foo))
(do (clojure.core/in-ns (quote foo)) (clojure.core/with-loading-context
(clojure.core/refer (quote clojure.core))))
其他函数不能使用不带引号的参数,因为它们是函数,函数首先评估参数。
ns宏,作为一个宏,可以在评估之前查看并调整其参数 ,以便它可以在my-new-namespace之前获取读者试图将其视为变量名称。
简而言之,这可以节省你的键盘和手腕的磨损和皮重;)开玩笑,在这两种情况下,功能接收的是一个符号,它们只是你要做的就是传递它们的符号。
对于同伴;如果您继续前进并通过(ns 'my-new-namespace)
,它将获得符号'my-new-namespace
所有引号!您可能不希望引号成为名称空间的一部分。
如果你想使它保持一致,你可以编写包装宏来为其余的命名空间函数取出不带引号的符号,这些符号引用第一个参数并返回对实际函数的调用(请记住,宏返回要调用的代码) )
(defmacro my-find-ns [name]
`(find-ns (quote ~name)))
虽然这会打破“宏观俱乐部的第一条规则”
关于作为列表的参数的错误是由于它尝试使用(quote my-new-namespace)
作为名称而引起的
user> (macroexpand '(ns 'foo))
(do (clojure.core/in-ns (quote (quote foo))) (clojure.core/with-loading-context
(clojure.core/refer (quote clojure.core))))