Как загрузить строку в текущее пространство имен (не ядро)? - PullRequest
6 голосов
/ 22 июня 2011

Я могу загрузить произвольный источник Clojure, используя:

(load-string source)

Однако, если пространство имен не было предоставлено, он загружает код в clojure.core пространство имен.

Например, следующий код:

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

определяет функцию:

#'clojure.core/add

Теперь есть способ загрузить этот кодв какое-то другое пространство имен, предпочтительно такое же, в котором вызывается функция load-string?

(За исключением добавления предваряющего объявления пространства имен к строке source перед оценкой. Я знаю, что это решит проблему - я 'хотелось бы узнать есть ли предпочтительный способ)

1 Ответ

12 голосов
/ 23 июня 2011

, когда def необходимо решить, в какое пространство имен должна помещаться новая функция, он смотрит на текущее значение переменной <em>ns</em> и добавляет новую функцию в это пространство имен. поскольку <em>ns</em> - это переменная, вы можете динамически связать ее перед вызовом load-string

user> (binding [*ns* (find-ns 'foo)] (load-string "(defn f [] 4)"))
#'foo/f
user> (foo/f)
4
...