在Clojure中,如何获取命名变量和函数的命名空间的名称?例如,改进以下内容:
(ns my-ns)
(def namespace-name "my-ns")
上面的问题是,如果我想更改my-ns的名称,我还必须更改namespace-name的定义
答案 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
你刚收到了一个Namespace对象,但我不能告诉你如何用它做什么。到目前为止,我只知道接受命名空间对象的函数实习生
user=> (intern working-namespace 'my-var "somevalue")
#'my-namespace/my-var
答案 3 :(得分:1)
所以,我们走了:
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"