【发布时间】:2013-08-09 03:17:20
【问题描述】:
我正在 Clojure 中尝试使用 ns,这是我尝试的方法:
user=> (in-ns 'some-ns)
#<Namespace some-ns>
some-ns=> (def aa 100)
#'some-ns/aa
some-ns=> (in-ns 'user)
#<Namespace user>
user=> (= some-ns/aa 100)
true
user=> (= user/aa 100)
CompilerException java.lang.RuntimeException: No such var: user/aa, compiling:(NO_SOURCE_PATH:5:1) ;this works as expected
user=> (defn function [] (in-ns 'some-other-ns) (def cc 100) (in-ns 'user))
#'user/function
user=> (function)
#<Namespace user>
user=> (= some-other-ns/cc 100)
CompilerException java.lang.RuntimeException: No such var: some-other-ns/cc, compiling:(NO_SOURCE_PATH:8:1)
user=> (= user/cc 100)
true
我很困惑,为什么它在功能上不起作用?另外,我尝试了以下操作:
user=> (binding [*ns* (create-ns 'some-a-ns)] (def dd 100))
#'user/dd
user=> (= some-a-ns/dd 100)
CompilerException java.lang.RuntimeException: No such var: some-a-ns/dd, compiling:(NO_SOURCE_PATH:11:1)
user=> (= user/dd 100)
true
使用符号名称和当前命名空间 (*ns*) 的值的命名空间创建和实习或定位一个全局变量。
我错过了什么?
PS。我知道我可以使用(intern 'some-ns 'a 100),但我真正想要的是一个通用函数/宏来做类似
(with-ns 'some-ns (def a 100))
(= some/a 100)
【问题讨论】:
-
我不建议使用它,但这会起作用:
(do (in-ns 'some-a-ns) (def dd 100))- 将dd定义为some-a-ns/dd
标签: clojure namespaces