以编程方式创建新的命名空间,并将vars放在另一个命名空间中

时间:2014-02-08 10:49:42

标签: clojure

说我在test.core并且我想创建test.new-ns并在那里粘贴一个名为new-method的var。有没有办法在不离开test.core的情况下做到这一点?

这就是我想要做的事情:

(ns test.core)

(create-ns 'test.new-ns)
(put-in-ns 'test.new-ns 'new-method {:meta 1} {:value 1})

 *ns* ;=> test.core
 test.new-ns/new-method ;;=> {:value 1}
 (meta #'test.new-ns/new-method) ;; => {:meta 1}

2 个答案:

答案 0 :(得分:3)

create-ns实际上存在于clojure.core中并且具有此签名。

至于put-in-ns,称为intern;另外,它不是将元数据映射作为单独的参数接受,而是将附加到“name”符号的任何元数据传输到Var:

(intern 'test.new-ns (with-meta 'new-method {:meta 1}) {:value 1})

Reader meta也可以,只要你把它“放在引号内”:

(intern 'test.new-ns ' ^{:meta 1} new-method {:value 1})

答案 1 :(得分:2)

我相信你正在寻找intern

  

在命名空间中查找或创建由符号名称命名的var   ns(可以是符号或命名空间),设置其根绑定   如果提供,则为val。命名空间必须存在。 var将采用任何   名称符号中的元数据。返回var。

所以对于你的例子,它会有点像这样:

(ns test.core)

(create-ns 'test.new-ns)

(intern 'test.new-ns 'new-method {:value 1})