ns的参数是什么?

时间:2010-09-19 19:36:05

标签: function namespaces clojure

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是什么?

ps:想想我在这里写出问题的时候想出了答案,但这似乎是一个有趣的练习,所以问题仍然张贴了:D

1 个答案:

答案 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))))
相关问题