2010-07-13 3 views
5

Я только начинаю изучать Clojure и Emacs. У меня Clojure ящик для окон работает, и я хотел бы иметь возможность писать код в буфер затем запустить его в РЕПЛ без имеющ называтьОбновить файлы Clojure в emacs

(use 'example.code) 

все время. Я знаю о C-c C-k, но он не перезагружает пространство имен. Если я использую

(in-ns 'example.code) 

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

ответ

10

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

0

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

+0

Также in-ns является «правильным путем» для переключения пространств имен, а не ns. Предполагается, что ns вызывается только один раз, чтобы настроить пространство имен со всеми его требованиями, использованием и импортом. Когда это делается, in-ns используется для переключения пространства имен. – kotarak

+0

Вы правы, я пропустил in-ns, более подходящий для repl – jneira

Смежные вопросы