Перезагрузите файлы Clojure в Emacs - PullRequest
5 голосов
/ 13 июля 2010

Я только начинаю изучать Clojure и Emacs.У меня есть Clojure Box для запуска Windows, и я хотел бы иметь возможность писать код в буфер, а затем запускать его в REPL без необходимости постоянно вызывать

(use 'example.code)

.Я знаю о Cc Ck, но он не перезагружает пространство имен.Если я использую

(in-ns 'example.code)

, чтобы изменить пространство имен в ответе, это работает.Как правильно это сделать?

Ответы [ 2 ]

10 голосов
/ 13 июля 2010

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 и др., Но я помню, как сталкивался со странными случаями, когда этого было недостаточно ... Возможно, моя ошибка, возможно, какой-то загадочный аспект этих функций у меня пока нет полностью изучен.)

0 голосов
/ 13 июля 2010

Возможно, «грязный» способ - просто переключиться на пространство имен буфера в repl с помощью (ns 'example.code).Грязный, потому что вы смешиваете определения буфера с репликами.Я думаю, что ответ Marczyk является правильным.

...