in-ns
является одним из правильных путей.
Для меня наиболее "правильным" является способ (require '[example.code :as ec])
и работа в пространстве имен user
в 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
ed класс - это включает в себя записи и deftype
созданные типы. :reload-all
по-прежнему вызывает перекомпиляцию форм deftype
и др., Но я помню, как сталкивался со странными случаями, когда этого было недостаточно ... Возможно, моя ошибка, возможно, какой-то загадочный аспект этих функций у меня пока нет полностью изучен.)