Подтвердить что ты не робот

Эффективный рабочий процесс 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 тоже приветствуются.

4b9b3361

Ответ 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, чтобы найти пространства имен и загрузить их все....