В настоящее время я нахожусь в процессе добавления функциональности в существующее веб-приложение J2EE в контейнере Tomcat, и я пишу свои дополнения с использованием Clojure.Моя установка проста: я просто добавляю вызовы к статическим методам, генерируемым clojure, и кодирую всю тяжелую работу со стороны clojure.Процесс сборки состоит в том, чтобы скомпилировать код clojure (lein uberjar
), а затем скомпилировать код java с этим jar на пути к классам.
В инициализации webapp у меня есть вызов к сгенерированному классу, который запускает сервер swank с (swank/start-repl)
.Я хотел бы иметь возможность подключить слизь моего Aquamacs к этому серверу и работать в интерактивном режиме оттуда (до определенного момента, я не буду пробовать ничего, что требует перекомпиляции на стороне Java).Но у меня есть ситуация, которую я не совсем понимаю.Если я делаю \M-x slime-connect
, я получаю приглашение REPL (после того, как получаю уведомление, что нет низшего процесса lisp, что, я думаю, нормально, поскольку процесс нижнего lisp выполняется вне контроля emacs).Я могу отлично оценивать формы и даже проверять такие вещи, как my.own.namespace/my-var
.Однако, если я захожу в файл с уже скомпилированным кодом clojure, я не могу заставить слизь распознать его как его источник.Рассмотрим простой файл clojure:
(ns my.namespace
(:gen-class
:name my.namespace
:methods [#^{:static true} [testFunc [] void]]))
(def *secret* "shhhh")
(defn -testFunc []
(println (str "our secret is: " secret)))
Предполагая, что он был скомпилирован и включен в uberjar, загруженный веб-приложением, я могу проверить / проверить my.namespace/*secret*
.Но если я попытаюсь вычислить внутри буфера кода, Slime думает, что я нахожусь в пространстве имен user
(что может даже иметь смысл!).Но теперь я остался с одним рабочим вариантом - я должен оценить - по одной, все формы в файле!\C-c \C-l
(загрузка исходного файла) ничего не сделает - очевидно, просто возвращает nil и больше ничего не выводит.Компиляция всего, кажется, делает это - он компилирует, показывает ошибки, если находит их, но не меняет мое пространство имен.И самым странным является \C-~
(пакет синхронизации и каталог), который с помощью Common Lisp делает то, что я хочу, но здесь он навсегда замораживает clojure REPL.
Всегда есть возможность переключиться на REPL, набрав (in-ns 'my.namespace)
, и тогда все работает правильно.Но это просто недостаточно практично, когда число файлов clojure растет (так как пространство имен буфера кода не изменится автоматически!)
В таком случае у меня вопрос, не хватает ли мне базовыхкоманда / конфигурация - или если есть очевидная причина для такого поведения, как такового.