Я только начинаю изучать Clojure и Emacs. У меня есть Поле Clojure для выполнения окон, и я хотел бы смочь написать код в буфере, затем выполняет его в REPL без haveing для вызова
(use 'example.code)
все время. Я знаю о C-c C-k, но он не перезагружает пространство имен. Если я использую
(in-ns 'example.code)
для изменения пространства имен в repl, это работает. Что правильный путь состоит в том, чтобы сделать это?
in-ns
- один из верных путей.
Мне кажется наиболее "правильным" путь (require '[example.code: as ec])
и работа в пространстве имен user
в REPL; таким образом мое одноразовое экспериментальное состояние остается в user
и ec / foo
достаточно удобно для меня (и это делает очевидным, откуда должен взяться foo
) . Вы всегда можете сказать (require: reload-all 'example.code)
(то же самое работает с , используйте
) для принудительной перекомпиляции.
Кроме того, вот функция для удаления (из текущего пространства имен) всех отображений, извлеченных из данного пространства имен с помощью , используйте
:
(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))
и сказать ] (повторно используйте 'example.code)
, чтобы начать что-то вроде нового начала с вашим пространством имен. (Обратите внимание, что 1.2 новые функции, такие как deftype
и defrecord
, вносят некоторые сложности ... В частности, unuse
не влияет на import
ed - сюда входят записи и типы, созданные deftype
. : reload-all
по-прежнему вызывает перекомпиляцию форм deftype
и др., но я помню попадание в странные случаи, когда этого показалось недостаточно ... Возможно, моя ошибка, возможно, какой-то таинственный аспект этих функций, который я еще полностью не изучил.)
Может быть, "грязный" способ - просто переключиться на пространство имен буфера в repl с (ns 'example.code) . Грязный потому, что вы смешиваете определения буфера с определениями repl. Я думаю, что ответ Marczyk правильный.