Перезагрузите файлы 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 является правильным.

Другие вопросы по тегам