代码之家  ›  专栏  ›  技术社区  ›  Belun

ns的参数是什么?

  •  2
  • Belun  · 技术社区  · 14 年前

    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

    1 回复  |  直到 14 年前
        1
  •  3
  •   Arthur Ulfeldt    14 年前

    ns是一个宏,如果引用名称可以省去麻烦:

    user> (macroexpand '(ns foo))
        (do (clojure.core/in-ns (quote foo)) (clojure.core/with-loading-context   
            (clojure.core/refer (quote clojure.core))))
    

    其他函数无法摆脱未加引号的参数,因为它们是函数,并且 函数首先计算参数 .

    ns宏,作为 ,来看看和玩弄它的论点 在评估之前 因此,它可以在读卡器尝试将其作为变量名查找之前找到我的新名称空间。

    简言之,这就节省了键盘和手腕上的磨损和皮重;)开玩笑的是,在这两种情况下,函数接收到的是一个符号,它们与传递该符号所必须做的操作不同。

    为了比较;如果你去哪里然后通过 (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))))