2011-06-22 4 views
5

私が使用任意Clojureのソースをロードすることができる:名前空間が提供されなかった場合現在の名前空間(コアではない)に文字列をロードする方法は?

(load-string source)

しかし、それはclojure.core名前空間にコードをロードします。

たとえば、コード次

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

する関数を定義する:

#'clojure.core/add

次に、好ましくは同一の、いくつかの他の名前空間にそのコードをロードする方法がありますload-stringという関数が呼び出されているものはありますか?

(評価の前にsource文字列に名前空間宣言を付加以外に、私はそれが問題を解決するだろうことを知っている - 。私が知りたいのですが、好ましい方法はあり)

答えて

11

何namspace Aを決定する必要がありますdefとき新しい関数を追加すると、ns varの現在の値が調べられ、新しい関数がその名前空間に追加されます。 nsはvarであるため、ロード文字列を呼び出す前に動的にバインドできます。

user> (binding [*ns* (find-ns 'foo)] (load-string "(defn f [] 4)")) 
#'foo/f 
user> (foo/f) 
4 
関連する問題