Clojure:引用命名空间的名称

时间:2010-09-21 19:38:56

标签: namespaces clojure

在Clojure中,如何获取命名变量和函数的命名空间的名称?例如,改进以下内容:

(ns my-ns)

(def namespace-name "my-ns")

上面的问题是,如果我想更改my-ns的名称,我还必须更改namespace-name的定义

4 个答案:

答案 0 :(得分:13)

亚瑟答案的简单修改效果很好。

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

但是我想警告Clojure的初学者

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

不适用于此问题,因为* ns *是动态绑定的。

答案 1 :(得分:8)

当前命名空间存储在

*ns* 

由于您的函数在运行时被评估,因此当您调用它时,您将获得* ns *的值。

所以如果您想要保存它的副本。

答案 2 :(得分:3)

创建和存储命名空间,您可以这样做:

user=> (def working-namespace (create-ns 'my-namespace))
#'user/working-namespace

user=> working-namespace
#<Namespace my-namespace>

user=> (class working-namespace)
clojure.lang.Namespace

你刚收到了一个N​​amespace对象,但我不能告诉你如何用它做什么。到目前为止,我只知道接受命名空间对象的函数实习生

user=> (intern working-namespace 'my-var "somevalue")
#'my-namespace/my-var

答案 3 :(得分:1)

好的,在这个家伙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!

虽然我不认为重新分配变量是惯用语,但你可以将它构建成一个函数,它将名称空间的持有者var作为参数

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

user=> (intern working-namespace 'some-var "my value")
#'other-namespace/some-var

user=> (var-get (intern working-namespace 'some-var))
"my value"