我可以使用以下方法加载任意Clojure源:
(load-string source)
但是,如果未提供名称空间,则会将代码加载到clojure.core
名称空间。
例如,代码如下:
(load-string "(defn add [a b] (+ a b))")
定义一个函数:
#'clojure.core/add
现在,有没有办法将该代码加载到其他名称空间,最好是调用load-string
函数的名称空间?
(除了在评估之前将名称空间声明添加到source
字符串之外。我知道它会解决问题 - 我想知道是否有首选方法)
答案 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