Эффективный рабочий процесс Clojure?

Я разрабатываю любимый проект с Clojure, но задаюсь вопросом, могу ли я ускорить свой рабочий процесс немного.

Мой текущий рабочий процесс (с Compojure):

  1. Запустите чванство с lein swank.
  2. Перейдите к Emacs, подключению с M-x slime-connect.
  3. Загрузите все существующие исходные файлы один за другим. Это также запускает Гагатовый сервер и приложение.
  4. Напишите некоторый код в REPL.
  5. Когда удовлетворенный экспериментами, запишите полную версию конструкции, которую я имел в виду. Оценка (C-c C-c) это.
  6. Переключите REPL на пространство имен, где эта конструкция находится, и протестируйте его.
  7. Переключитесь на браузер и перезагрузите вкладку браузера с затронутой страницей.
  8. Настройте код, оценка это, зарегистрируйтесь в браузере.
  9. Повторите любое вышеупомянутое.

Существует много раздражений с ним:

  1. Я должен переключиться между Emacs и браузером (или браузеры, если я тестирую вещи как шаблонная обработка с несколькими браузерами), все время. Существует ли общая идиома для автоматизации этого? Я раньше имел бит JavaScript, который перезагружает страницу непрерывно, но это имеет ограниченную утилиту, очевидно, когда я должен взаимодействовать со страницей в течение больше, чем нескольких секунд.
  2. Мой экземпляр JVM становится "грязным", когда я экспериментирую и функции теста записи. В основном пространства имен становятся загрязненными, особенно если я осуществляю рефакторинг и перемещаю функции между пространствами имен. Это может привести к коллизиям символа, и я должен перезапустить Чванство. Могу я undef символ?
  3. Я загружаю все исходные файлы один за другим (C-c C-k) после перезапуска Чванства. Я подозреваю, что делаю все это неправильно.
  4. Переключение между REPL и редактором файлов может быть немного раздражающим, особенно когда у меня есть много открытых вкладок Emacs, вместе с браузером (браузерами).

Я ищу способы улучшить вышеупомянутые точки и весь рабочий процесс в целом, таким образом, я ценил бы, если Вы совместно используете Ваш.

P. S.

Я также использовал Vimclojure прежде, таким образом, находящиеся в Vimclojure рабочие процессы приветствуются также.

28
задан Alex B 6 June 2010 в 12:27
поделиться

2 ответа

Не полное описание рабочего процесса, только несколько идей:

  1. Можно удалить Var из пространства имен с помощью функции ns-unmap. Для большего удобства поверх нее можно построить макрос undef, например, так:

    (defmacro undef [& syms]
     `(do ~@(map (fn [s] `(ns-unmap *ns* '~s)) syms)))))
    

    ns-unalias также может представлять интерес.

  2. Нет смысла перебирать файлы, содержащие пространства имен, чтобы просто выполнить C-c C-k в каждом из них; вы можете просто потребовать нужные вам пространства имен в REPL.

    Более того, если вы наберете несколько символов в SLIME REPL, а затем воспользуетесь M-p / M-n для просмотра истории, будут показаны только записи, соответствующие начальному тексту, который вы ввели вручную. Это совместимо с Paredit (закрывающая скобка (скобки) не будет проблемой). Итак, если вы создадите огромный require в самом начале -- (require '[foo :as f] '[bar :as b] '[clojure.contrib.sql :as sql] ...) -- то после перезапуска Swank вам достаточно набрать что-то вроде (require '[f и нажать M-p, чтобы снова вывести эту форму в подсказку REPL.

    Конечно, это можно автоматизировать различными способами (например, заставить Swank REPL искать конфигурационный файл, или, возможно, простой макрос, расширяющийся в соответствующую форму require, которая может быть использована после ввода только одного пространства имен утилиты из проекта - особенно последнюю идею было бы легко реализовать), но я нахожу это достаточно низким по фактору раздражения, поэтому пока не беспокоюсь о каких-либо улучшениях.

  3. Вы можете использовать C-c C-z, чтобы сделать окно с SLIME REPL всплывающим, когда вы находитесь в буфере с поддержкой SLIME. Кроме того, попробуйте использовать ido если вы еще этого не сделали. Я обычно работаю с буфером кода, открытым в окне в левой части экрана, и буфером REPL в правой; с windmove-left и windmove-right, привязанными к некоторым удобным клавишам, я обычно вполне счастлив. Если мне нужно часто просматривать дополнительные буферы, я использую дополнительные фреймы Emacs.

  4. Кстати, я не использую lein swank обычно, я предпочитаю мою пользовательскую clojure-project функцию (подправленную версию оригинальной функции Фила Хагельберга). Иногда я чувствую желание улучшить ее... возможно, в следующий раз я займусь автоматизацией import / require для каждого проекта. ;-)

19
ответ дан 28 November 2019 в 03:50
поделиться

Не уверен насчет Lein, но в Maven можно указать имя скрипта repl (replScript config param), что позволяет указать какие команды будут выполняться при запуске REPL & Swank... И если у вас есть отдельные пространства имен для вашего проекта, вы можете использовать функции из clojure.contrib.find-namespaces, чтобы найти ваши пространства имен и загрузить их все....

5
ответ дан 28 November 2019 в 03:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: