Как мне подключить исходный файл clojure к работающему repl clojure в Emacs? - PullRequest
5 голосов
/ 12 августа 2010

В настоящее время я нахожусь в процессе добавления функциональности в существующее веб-приложение 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 растет (так как пространство имен буфера кода не изменится автоматически!)

В таком случае у меня вопрос, не хватает ли мне базовыхкоманда / конфигурация - или если есть очевидная причина для такого поведения, как такового.

Ответы [ 3 ]

5 голосов
/ 12 августа 2010

Возможно, я неправильно понимаю вашу проблему, но вы не можете (во время посещения этого гипотетического буфера в emacs) нажать C-c C-k, чтобы скомпилировать буфер в вашем текущем экземпляре Clojure (с которым связан Slime)?

Затем в буфере слизи переключитесь на это пространство имен с помощью (in-ns 'my.namespace).Тогда у вас должен быть доступ к тому, что вы скомпилировали в этом пространстве имен.

2 голосов
/ 13 августа 2010

Автоматическое переключение пространств имен при компиляции никогда не было по умолчанию для swank-clojure, хотя это может быть дополнительная функция слизи, которая работала с Clojure.Но Cc Mp, чтобы переключить repl в пространство имен текущего буфера, всегда работало для меня, и я никогда не слышал, чтобы у кого-то возникли проблемы с ним.шламовых РЕПЛ?У вас установлен swank-clojure.el?(Вам это не нужно.) Похоже, это может быть связано с несовпадающими версиями elisp libs.Если это не проблема, это может быть ошибка Aquamacs;swank-clojure предназначен для работы с GNU Emacs.Это также может быть ошибка в слизи, если вы работаете из транка, а не в последней версии elpa.

1 голос
/ 21 августа 2010

Я только что узнал, что удаление виновника для этой проблемы: slime-redirect-inferior-output, из slime-repl.el, вызывалось из перехвата, который я настроил.Оказывается, что он не очень хорошо работает без подчиненного процесса lisp (читай, сервер-swank запущен из emacs).

Так что быстрый обходной путь - просто удалить форму error изэта функция, как это .Теперь ловушка продолжается, и пространства имен автоматически рассчитываются.Как предполагалось.Тем не менее, спасибо за предложения - они привели меня к этому решению!

...