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

StackOverflow https://stackoverflow.com/questions/2391711

Вопрос

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

До сих пор все, что я видел о руководствах по компиляции программ Clojure, включает в себя интерактивность. Например, «Загрузите refl and Type (загрузить файл» - или что "). Это нормально, но этого недостаточно.

Я так привык к идентификаторам языков, таких как C или Delphi, которые я инстинктивно приводил в действие, чтобы сделать редактирование, затем нажмите «Compile MX».

Проблема в том, что «Лейн Убергар», который я понимаю, является эквивалентом «сделать», болезненно медленно выполняется даже для Hello World. Поэтому мне придется выяснить, как работает эта «интерактивная разработка», останавливайтесь, перестаньте использовать Uberjar, как это быстрое сделать, и сохранить его только на конец дня.

Еще одна вещь, которую я заметил, в то время как здание (используя Лейна Убергар), это то, что приложение для малого графического интерфейса, которое я работаю над всплывающими кадрами в процессе компиляции, как будто они исполнение во время компиляции. Это просто кажется немного противодействием мне; Это не так, как аналогично «сделать», как я думал.

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

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

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

(Примечание: у меня есть все предварительные условия, установленные и работающие (например, Emacs, Slime, Leinhen и т. Д.), Так это не вопрос об этом).

Это было полезно?

Решение

Пара быстрых подсказок, то некоторые ссылки:

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

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

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

Что касается сброса состояния reft - вы можете просто перезапустить его. С слислом, MX Slime-Restart-Indelenior-Lisp-Lisp сделает только при сохранении всего другого состояния вашего сеанса Emacs.

Смотрите также эти обсуждения в Google Google Group:

  1. Clojure для системного введения
  2. Predping Clojure для упаковки (был: Re: Clojure для администрирования системы)
  3. Лейнинген, Clojure и библиотеки: что я скучаю?

Другие советы

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

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

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

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


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

  • Начать Emacs
  • M-x slime Чтобы начать слизь, систему LISP и подключить два через Swank
  • , (Команда) load-system foo загрузить текущий проект (компиляция только при необходимости) на изображение
  • C-x b Переключиться на исходный буфер
  • C-c ~ Сделайте исходный каталог текущий каталог и исходный пакет текущего пакета refr

Теперь я настроен с моей системой, работающей на заднем плане. Работа тогда:

  • изменить или добавить функцию или определение класса
  • C-c C-c скомпилировать и загрузить его в изображение
  • Переключиться на repl, тестируйте
  • отлаживать

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top