Перезагрузите файлы Clojure в Emacs
Я только начинаю изучать Clojure и Emacs. У меня есть Clojure Box для запуска Windows, и я хотел бы иметь возможность написать код в буфер, а затем запустить его в REPL без необходимости вызова
(use 'example.code)
все время. Я знаю о Cc Ck, но он не перезагружает пространство имен. Если я использую
(in-ns 'example.code)
чтобы изменить пространство имен в репле он работает. Как правильно это сделать?
2 ответа
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
Эд класс - это включает в себя записи и deftype
типы. :reload-all
до сих пор вызывает deftype
и другие. формы, которые нужно перекомпилировать, но я помню, как сталкивался со странными случаями, когда этого было недостаточно... Возможно, моя ошибка, возможно, какой-то загадочный аспект этих функций, который я еще не полностью изучил.)
Возможно, "грязный" способ - просто переключиться на пространство имен буфера в repl с помощью (ns 'example.code) . Грязный, потому что вы смешиваете определения буфера с репликами. Я думаю, что ответ Marczyk является правильным.