in-ns
- один из правильных способов.
Путь, который чувствует себя наиболее «правым» для меня, - это (require '[example.code :as ec])
и работает в пространстве имен на REPL; так что мое экспериментальное состояние остается в user
и ec/foo
достаточно удобно для меня (и это делает очевидным, откуда должен прибыть foo
). Вы всегда можете сказать (require :reload-all 'example.code)
(то же самое работает с use
), чтобы принудительно перекомпилировать.
Кроме того, здесь есть функция, чтобы удалить (из текущего пространства имен) все отображения тянут в из заданного пространства имен с use
:
(defn unuse [ns]
(doseq [[n v] (ns-refers *ns*)]
(if (= (.. v ns name) ns)
(ns-unmap *ns* n))))
На вершине, что вы могли бы построить
(defn reuse [ns]
(unuse ns)
(remove-ns ns)
(use :reload-all ns))
и скажем (reuse 'example.code)
, чтобы получить что-то близкое к новому началу с вашим пространством имен. (Обратите внимание, что 1.2 новые функции, такие как deftype
& defrecord
ввести некоторые сложности ... В частности, unuse
не оказывает никакого влияния на класс import
ред. - это включает в себя записи и deftype
-created типов :reload-all
еще вызывает deftype
и др формы, чтобы быть. перекомпилирован, но я помню, что я поражал странные случаи, когда этого, похоже, не было достаточно ... Возможно, моя ошибка, возможно, какой-то тайный аспект этих особенностей я еще не изучил полностью.)
Также in-ns является «правильным путем» для переключения пространств имен, а не ns. Предполагается, что ns вызывается только один раз, чтобы настроить пространство имен со всеми его требованиями, использованием и импортом. Когда это делается, in-ns используется для переключения пространства имен. – kotarak
Вы правы, я пропустил in-ns, более подходящий для repl – jneira