Лучшие практики в создании и развертывании приложений Clojure: хорошие учебные руководства?

Я плохо знаком с Clojure и начинаю экспериментировать с создаванием приложения.

До сих пор все, я занялся учебными руководствами при компиляции программ Clojure, включает интерактивность. Например, "загрузите REPL и тип (файл загрузки "this-that") для выполнения. Это прекрасно, но это недостаточно.

Я так привык к edit-compile-run идиомам языков как C или Delphi, что я инстинктивно управляюсь для создания редактирований, затем поражаюсь "компиляция M-x".

Проблема состоит в том, что "lein uberjar", то, которое я понимаю, является эквивалентом, чтобы "сделать", мучительно не спешит выполняться даже для привет мир. Таким образом, я оказываюсь перед необходимостью выяснять, как эта "интерактивная разработка" работы материала, прекратите использовать uberjar как, он быстр, делают и сохраняют его только для конца дня.

Другая вещь, которую я заметил при создании (использующий lein uberjar) состоит в том, что маленькое приложение для GUI, я продолжаю работать, открывается кадры в процессе компиляции, как будто они выполняются при компиляции. Это просто кажется немного парадоксальным мне; это не совсем как походит, "делают", как я думал.

Я знаю Lisp, способ разработать вещи в интерактивном режиме работает в REPL, и я не пытаюсь изменить это: Я хотел бы адаптироваться к этому образу жизни. К сожалению, я видел мало в форме документации относительно того, как сделать так. Например, как сбросить текущее состояние машины. Это просто кажется довольно грязным, чтобы просто продолжать компилировать отдельные отрывки, на лету не имея возможности сделать своего рода сброс.

Большинство учебных руководств, которые я видел на Clojure (и Lisp) в целом, кажется, фокусируется на взламывании в REPL. Лучшие практики на развертывании приложений остаются тайной мне. Мои пользователи просто собираются быть пользователями; они не собираются быть разработчиками, которые собираются загрузить файлы в REPL.

Таким образом, вот мой вопрос: какие-либо ресурсы для хорошей информации или учебных руководств на всем процессе создавания приложения Clojure, включая развертывание?

(Примечание: у Меня есть все установленные предпосылки и работающий (например, Emacs, Слизь, Leiningen, и т.д.), таким образом, это не вопрос об этом).

47
задан kes 6 March 2010 в 07:21
поделиться

2 ответа

Пара подсказок, затем несколько ссылок:

Не используйте lein uberjar во время разработки; предпочитайте lein jar . Разница в том, что lein uberjar помещает все ваши зависимости в сгенерированный jar (включая сам Clojure), так что ваш единственный jar-файл является полностью автономным пакетом с вашим приложением внутри; lein jar хранит только ваш собственный код. Подход uberjar имеет очевидные преимущества для развертывания, но для разработки вы должны иметь возможность просто использовать соответствующий путь к классам при запуске приложения, экономя время, необходимое для подготовки uberjar. Если вы не хотите вручную управлять путем к классам для выполнения тестов, попробуйте плагин lein run .

Также, скорее всего, большая часть вашего кода не должна компилироваться AOT.AOT необходим в некоторых сценариях взаимодействия с Java, но в большинстве случаев он приводит к небольшому увеличению скорости запуска и досадным проблемам с двоичной совместимостью с различными версиями Clojure. Я полагаю, что последняя проблема не имеет отношения к проекту типа автономного приложения с uberjar , но любой код библиотеки, по крайней мере, следует оставить для JIT-редактирования, если это вообще возможно. Используя Leiningen, вы можете поместить предложение : namespaces в форму defproject в project.clj , чтобы определить, какие пространства имен должны быть скомпилированы; все, что вы опускаете, в настоящее время будет JIT-редактироваться по умолчанию. Старые версии Leiningen по умолчанию компилировали все, что на самом деле является хорошей причиной для обновления!

Что касается всплывающих окон во время компиляции, я предполагаю, что вы либо выполняете код всплывающего окна во время расширения макроса, либо вне определения функции или аналогичной конструкции. (Что-то вроде (println "Foo!") на верхнем уровне.) Я полагаю, что вам просто не следует этого делать - если вы не планируете запускать свой код как сценарий, в любом случае. Чтобы избежать этой проблемы, оберните побочный код в определения функций и предоставьте точку входа в ваше приложение, используя предложение : main в project.clj . (Если вы скажете : main foo , то функция -main из пространства имен foo будет использоваться в качестве точки входа в ваше приложение.Во всяком случае, это значение по умолчанию, и, по крайней мере, упомянутое выше lein run , похоже, жестко запрограммировано - не уверен насчет самого lein.)

Что касается сброса состояния REPL - вы можете просто перезапустите его. С SLIME M-x slime-restart-inferior-lisp будет делать именно это, сохраняя при этом все остальные состояния вашего сеанса Emacs.

См. Также эти обсуждения в группе Google Clojure:

  1. Clojure для системного администрирования
  2. Подготовка clojure для упаковки (было: Re: Clojure для системного администрирования)
  3. Leiningen, Clojure и библиотеки: что мне не хватает ?
26
ответ дан 26 November 2019 в 19:56
поделиться

Нет, вы не вводите функции в REPL.

Вы, как обычно, редактируете исходные файлы. Преимущество Лиспа в том, что у вас одновременно работает система в фоновом режиме, поэтому вы можете скомпилировать отдельные функции из исходного файла и поместить их в работающую систему или даже заменить их там.

Если вы используете Slime, вы нажимаете C-c C-c в исходном файле, чтобы скомпилировать и загрузить функцию в точке. Затем вы можете переключиться на REPL для тестирования и изучения, но все, что вы хотите сохранить в качестве источника, вы помещаете в свои исходные файлы.

Учебные пособия обычно начинаются с ввода чего-либо в REPL, потому что вам не так уж много нужно настраивать для этого, но серьезная разработка объединяет работающую систему и управление исходными файлами.


Чтобы проиллюстрировать, мой обычный рабочий процесс (я использую Common Lisp, но Clojure похож на него) выглядит следующим образом:

  • Запустите Emacs
  • Mx slime , чтобы запустить Slime, систему Lisp, и подключить два через Swank
  • , (команда) load-system foo для загрузки текущего проекта (компиляция только при необходимости) в образ
  • Cx b переключиться на буфер исходного кода
  • Cc ~ делает исходный каталог текущим каталогом, а исходный пакет - текущим пакетом REPL

Теперь я настроен на то, что моя система работает в фоновом режиме.Затем работа заключается в следующем:

  • изменить или добавить определение функции или класса
  • Cc Cc для компиляции и загрузки в образ
  • переключиться на REPL, test
  • debug

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

13
ответ дан 26 November 2019 в 19:56
поделиться
Другие вопросы по тегам:

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