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

Clojure:指命名空间的名称

  •  11
  • chris  · 技术社区  · 14 年前

    (ns my-ns)
    
    (def namespace-name "my-ns")
    

    上面的问题是,如果我想更改我的ns的名称,我也必须更改名称空间名称的定义

    4 回复  |  直到 14 年前
        1
  •  14
  •   chris    14 年前

    对亚瑟的回答作一个简单的修改就行了。

    (def namespace-name (ns-name *ns*))
    

    不过,我想提醒Clojure初学者

    (defn namespace-name [] (ns-name *ns*))
    

    对于此问题,将不起作用,因为*ns*是动态绑定的。

        2
  •  9
  •   Arthur Ulfeldt    14 年前

    当前命名空间存储在

    *ns* 
    

    因为函数是在运行时计算的,所以调用函数时,会得到*ns*的值。

    所以如果你想保存一份。

        3
  •  3
  •   Belun    14 年前

    要创建和存储命名空间,可以执行以下操作:

    user=> (def working-namespace (create-ns 'my-namespace))
    #'user/working-namespace
    
    user=> working-namespace
    #<Namespace my-namespace>
    
    user=> (class working-namespace)
    clojure.lang.Namespace
    

    你刚刚得到了一个名称空间对象,但是我不能告诉你怎么用它。到目前为止我只知道这个函数 实习生 即接受命名空间对象

    user=> (intern working-namespace 'my-var "somevalue")
    #'my-namespace/my-var
    
        4
  •  1
  •   Community CDub    8 年前

    在Michael Kohl的帮助下,我发现了如何切换到变量中的名称空间( read here for more details )

    所以,我们开始:

    user=> (def working-namespace (create-ns 'my-namespace))
    #'user/working-namespace
    user=> (in-ns (symbol (str working-namespace) ))
    #<Namespace my-namespace>
    my-namespace=>
    ;; notice how it switched to "my-namespace"
    
    ;; now if i were to put some other namespace in that variable...
    my-namespace=> (ns user)
    nil
    user=> (def working-namespace (create-ns 'other-namespace))
    #'user/working-namespace
    
    ;; and switch again, i would get the new namespace
    user=> (in-ns (symbol (str working-namespace) ))
    #<Namespace other-namespace>
    other-namespace=> ; tadaa!
    

    尽管我不认为重新分配变量是习惯性的clojure,但您可以将其构建到一个函数中,该函数将名称空间的holder var作为参数

    现在来获取该名称空间内外的var值

    user=> (intern working-namespace 'some-var "my value")
    #'other-namespace/some-var
    
    user=> (var-get (intern working-namespace 'some-var))
    "my value"
    
    推荐文章