Эффективный рабочий процесс Clojure?
Я разрабатываю проект для домашних животных с Clojure, но задаюсь вопросом, могу ли я немного ускорить свой рабочий процесс.
Мой текущий рабочий процесс (с Compojure):
- Запустите Swank с помощью
lein swank
.
- Перейдите в Emacs, подключитесь к
M-x slime-connect
.
- Загрузите все существующие исходные файлы по одному. Это также запускает сервер Jetty и приложение.
- Напишите код в REPL.
- Когда вы удовлетворены экспериментами, напишите полную версию конструкции, которую я имел в виду. Eval (
C-c C-c
) it.
- Переключите REPL в пространство имен, в котором находится эта конструкция, и протестируйте ее.
- Переключитесь на браузер и перезагрузите вкладку браузера с затронутой страницей.
- Измените код, проверьте его, проверьте в браузере.
- Повторите любое из указанных выше действий.
С ним много неприятностей:
- Мне нужно переключаться между Emacs и браузером (или браузерами, если я постоянно тестирую такие вещи, как шаблоны с несколькими браузерами). Есть ли распространенная идиома для автоматизации этого? Раньше у меня был бит JavaScript, который перезагружает страницу непрерывно, но это ограниченная утилита, очевидно, когда мне приходится взаимодействовать со страницей более нескольких секунд.
- Мой экземпляр JVM становится "грязным", когда я экспериментирую и записываю тестовые функции. В основном пространства имен загрязняются, особенно если я рефакторинг и перемещение функций между пространствами имен. Это может привести к конфликтам символов, и мне нужно перезапустить Swank. Могу ли я отменить символ?
- Я загружаю все исходные файлы один за другим (
C-c C-k
) после перезапуска Swank. Я подозреваю, что делаю все это неправильно.
- Переключение между REPL и файловым редактором может быть немного раздражающим, особенно когда у меня открыто много вкладок Emacs вместе с браузерами.
Я ищу способы улучшить вышеупомянутые моменты и весь рабочий процесс в целом, поэтому я был бы признателен, если вы поделитесь своим.
Р. S.
Я также использовал Vimclojure раньше, поэтому рабочие процессы на основе Vimclojure тоже приветствуются.
Ответы
Ответ 1
Не полное описание рабочего процесса, всего несколько идей:
-
Можно удалить Var из пространства имен с помощью функции ns-unmap
. Для дополнительного удобства макрос undef
можно построить поверх него, например. так:
(defmacro undef [& syms]
`(do [email protected](map (fn [s] `(ns-unmap *ns* '~s)) syms)))
ns-unalias
также может представлять интерес.
-
Нет никаких причин, чтобы проходить через файлы, содержащие пространства имен, только для C-c C-k в каждом из них; вы можете просто require
пространства имен, которое вам нужно в REPL.
Кроме того, если вы наберете несколько символов в SLIME REPL, а затем используйте M-p/M-n для просмотра истории, будут отображаться только записи, соответствующие начальному бит текста, введенного вручную. Это совместимо с Paredit (конечная закрывающая скобка (-ы) не будет проблемой). Итак, если вы создаете огромную потребность в начале - (require '[foo :as f] '[bar :as b] '[clojure.contrib.sql :as sql] ...)
, то после перезапуска Swank все, что вам нужно сделать, это набрать что-то вроде (require '[f
и нажать M-p, чтобы принести эту форму в запрос REPL еще раз.
По общему признанию, это может быть автоматизировано несколькими способами (например, с поиском Swank REPL для файла конфигурации или, возможно, простым макросом, расширяющимся в соответствующую форму require
, которая может быть использована после ввода только одного пространства имен утилиты от проекта - особенно последняя идея будет легко реализована), но я нахожу его достаточно низким по коэффициенту досады, которого я до сих пор не беспокоил никаких улучшений.
-
Вы можете использовать C-c C-z, чтобы сделать окно с SLIME REPL всплывающим, пока вы находитесь в буфере с поддержкой SLIME. Кроме того, вы должны попробовать ido
, если вы еще этого не сделали. Я имею тенденцию работать с буфером кода, открытым в окне в левой части экрана и в REPL-буфере справа; с windmove-left
и windmove-right
связанными с некоторыми удобными ключами, я, как правило, очень счастлив. Если мне нужно часто смотреть на дополнительные буферы, я использую дополнительные кадры Emacs.
-
Кстати, я обычно не использую lein swank
, я предпочитаю свою собственную функцию clojure-project
(измененная версия Фил Хагельберг оригинал). Иногда я чувствую желание улучшить его... возможно, в следующий раз, когда это случится, я буду заниматься автоматизацией каждого проекта import
/require
.; -)
Ответ 2
Я не уверен в Lein, но в Maven вы можете указать имя repl script (параметр конфигурации replScript), который позволяет указать, какие команды будут выполняться при запуске REPL и Swank... И если у вас есть отдельное пространство имен для вашего проекта, вы можете использовать функции из clojure.contrib.find-namespaces, чтобы найти пространства имен и загрузить их все....