Clojure:关于命名空间名称的指称

14
在Clojure中,如何获取变量和函数所在的命名空间的名称?例如,改进以下代码:
(ns my-ns)

(def namespace-name "my-ns")

上述问题在于,如果我想更改my-ns的名称,那么我也必须更改namespace-name的定义。
4个回答

14
一个简单的修改Arthur的答案就可以很好地解决问题。
(def namespace-name (ns-name *ns*))

然而我想警告Clojure的初学者们

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

对于这个问题的目的来说,这不起作用,因为*ns*是动态绑定的。


2
但是类似于(defmacro defns-name [name] `(def ~name (ns-name ns)))这样的代码,然后调用(defns-name namespace-name)就可以工作了。 - Nicolas Oury
1
Markdown吃掉了Nicolas上面评论中ns周围的星号,应该是这样写的:(defmacro defns-name [name] \(def ~name (ns-name ns)))`。 - Martin Carpenter

9

当前的命名空间存储在

*ns* 

由于您的函数在运行时被评估,因此当您调用它时,您将得到 * ns * 的任何值。所以如果您想要保存它的副本。


你的意思是 (def namespace-name (ns-name *ns*)) 吗? - chris
我输入 ns,它显示为斜体?如何编写以便 SO 显示它的字面意思? - Arthur Ulfeldt
1
*ns* 可以用反引号括起来写,我猜。 - Peter Tillemans
(clojure.test/run-tests *ns*) - Aaron Blenkush

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

你刚刚得到了一个命名空间对象,但我不能告诉你关于它能做什么的太多信息。目前我只知道有一个函数intern可以接受一个命名空间对象。

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

1

好的,通过这位名叫Michael Kohl的人的帮助,我找到了如何切换到一个变量中保存的命名空间(在此处阅读更多细节

所以,我们开始吧:

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变量作为参数传递。

现在来获取该命名空间内外变量的值。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接