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

Gor*_*vic 6 namespaces clojure

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

(load-string source)

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

例如,以下代码:

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

定义一个函数:

#'clojure.core/add

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

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

Art*_*ldt 12

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

user> (binding [*ns* (find-ns 'foo)] (load-string "(defn f [] 4)"))
#'foo/f
user> (foo/f)
4
Run Code Online (Sandbox Code Playgroud)