如何将字符串加载到当前命名空间(而不是核心)?

时间:2011-06-22 16:54:06

标签: namespaces clojure

我可以使用以下方法加载任意Clojure源:

(load-string source)

但是,如果未提供名称空间,则会将代码加载到clojure.core名称空间。

例如,代码如下:

(load-string "(defn add [a b] (+ a b))")

定义一个函数:

#'clojure.core/add

现在,有没有办法将该代码加载到其他名称空间,最好是调用load-string函数的名称空间?

(除了在评估之前将名称空间声明添加到source字符串之外。我知道它会解决问题 - 我想知道是否有首选方法)

1 个答案:

答案 0 :(得分:12)

def需要决定新函数应该进入哪个namspace时,它会查看ns var的当前值并将新函数添加到该命名空间。因为ns是一个var,你可以在调用load-string

之前动态绑定它
user> (binding [*ns* (find-ns 'foo)] (load-string "(defn f [] 4)"))
#'foo/f
user> (foo/f)
4