Разработка на Clojure: IDE или REPL?

Я использую Clojure некоторое время и хочу создать несколько проектов, которые больше и сложнее, чем игрушки. Я использую Java в течение последних нескольких лет и привык к тому, что IDE делают для меня: компилировать множество классов, упаковывать их в jar-файлы, создавать пакетные файлы, с которыми пользователи могут их запускать.

Когда я смотрю на примеры разработки в Clojure, они кажутся похожими на загрузку файлов в REPL, посмотрите, как они работают, отредактируйте файл, перезагрузите, повторите. В любом месте не создается класс или банка. Например, в потрясающей книге Стюарта Хэллоуэя «Программирование на Clojure» я не смог найти ни одного примера «:gen-class». IDE Clojure, которые я использовал (ClojureBox и подключаемый модуль Enclojure NetBeans), по-видимому, поддерживают тот же рабочий процесс.

Это намеренно? Являются ли инструменты слишком незрелыми или я просто «не понимаю»?

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

Спасибо, что поделились своим мнением.


person clartaq    schedule 23.10.2009    source источник
comment
Если вы хотите доставить jar-файл конечному пользователю, просто используйте «lein uberjar». Вы по-прежнему будете использовать REPL для сборки программы, но конечный пользователь не должен использовать REPL для использования программы.   -  person Ravi Desai    schedule 16.06.2016


Ответы (7)


Я думаю, что здесь действительно 2 вопроса:

А) как развернуть (а также построить и управлять зависимостями). Все, что я могу сказать на это, это посмотреть на другие проекты с похожими целями/областями и скопировать их.

Б) Рабочий процесс:

Мой рабочий процесс выглядит следующим образом:

  1. откройте файл и напишите несколько высокоуровневых деклараций желаемого за действительное

  2. начните писать некоторые функции для его поддержки

2.5 копировать определения функций в REPL по мере их создания

  1. откройте другой файл и напишите несколько базовых тестов для проверки работы функции

3.5 скопировать их в REPL

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

  2. оберните вторичный файл в deftest

Теперь, когда я вернусь через месяц, я могу просто запустить свои тесты и быть счастливым! Сохранение буферов REPL может принести некоторую пользу без особых усилий. Это как раз то, что работает для меня в настоящее время, и я счастлив, что научился лучшему подходу.

Что касается выбора IDE и REPL - у большинства IDE есть плагины с REPL, поэтому я не уверен, что это тот или иной выбор - на самом деле это просто вопрос о том, в каком текстовом редакторе вы работаете, и как вы хотите управлять структурой вашего проекта. . Нет никаких готовых структур «сделай это таким образом», AFAIK, поэтому на данный момент легче смотреть на конкретные проекты (например, на сам Clojure, или на penumbra, или на compojure, или на любую из библиотек, перечисленных на основном сайте.

person Timothy Pratley    schedule 23.10.2009
comment
Если ваш редактор поддерживает отправку кода в REPL, вы можете избавиться от копирования и вставки (Emacs, vim с vim-fireplace, lighttable). - person Sad Developer; 18.07.2013

Подход к разработке REPL долгое время поощрялся большинством IDE семейства LISP (и других функциональных языков). Некоторые из этих REPL также имеют функции автозаполнения, которые вы можете связать с Java IDE.

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

person tsellon    schedule 23.10.2009

Ну, для начала, практически любой достойный плагин разработки для любого редактора или IDE даст вам возможность использовать Clojure REPL из IDE. Вероятно, даже позволит вам загружать файлы в REPL для тестирования и тому подобное. Вам не нужно выбирать одно или другое.

Enclojure идет долгий путь, это точно. Однако большинство людей вполне довольны использованием Emacs, в том числе и я. Emacs использует Lisp в качестве языка конфигурации, поэтому обычно это наиболее естественный выбор для Lisper.

Для языков, в которых есть REPL, использование REPL в качестве основной части процесса разработки является нормой. Редактирование файлов, загрузка их в REPL, игра с ними, чтобы увидеть, работает ли, полоскать, повторять. Это одно из основных преимуществ языков с REPL, таких как Clojure, Haskell, CL и тому подобное.

Что касается создания jar-файлов, компиляции кода Clojure и прочего, это просто. Вы даже не должны/компилировать код Clojure большую часть времени, если не хотите. Когда вы это сделаете, вы компилируете его с помощью AOT с помощью gen-class, который компилирует его в файлы классов, которые затем можно поместить в банку. В Интернете есть множество примеров и даже учебных пособий. Самый простой и эффективный способ — использовать что-то вроде Ant и написать скрипт сборки, который компилирует код Clojure и генерирует для вас .jar. В первый раз, когда я это делал, я думал, что это будет сложно сделать, но на самом деле это было очень просто. Я только что просмотрел файлы сборки Clojure и Clojure-Contrib Ant и обратился к страницам справки Ant за всем остальным, что мне было нужно.

Одна вещь, которую я должен упомянуть, это тот факт, что Enclojure действительно создает для вас исполняемые файлы .jar, если вы попросите это сделать. Я уверен, что в будущем будут добавлены более продвинутые вещи, к которым вы привыкли. Они, правда, еще совсем новые.

person Rayne    schedule 23.10.2009

Я использую как Eclipse IDE, так и плагин против часовой стрелки, который предоставляет REPL. Это особенно хорошая комбинация, если вы разрабатываете код Java вместе с Clojure (как это делаю я).

Мой общий подход таков:

  • Напишите код Clojure в редакторе
  • Держите REPL открытым для тестирования (здесь Ctrl+Enter является полезным сочетанием клавиш: он выполняет любой код, выбранный в вашем редакторе в REPL)
  • Используйте общие инструменты IDE для управления проектами, сборки, тестирования, SCM и т. д.

Иногда я также работаю чисто в REPL. Обычно это лучше для быстрого тестирования. Если мне особенно нравится кусок тестового кода, я просто скопирую/вставлю его из REPL в свой набор тестов.

person mikera    schedule 02.02.2011

Что я делаю, так это создаю проект с Leiningen. Если вы просто хотите немного отвлечься, вы можете просто ввести lein repl, и путь к классам вашего проекта будет настроен для этого repl.

На самом деле, я использую Emacs, Slime и шикарный clojure. После перехода к проекту просто введите M-x clojure-jack-in. Это запускает swank-сервер, и слизь подключается к нему, и у вас есть repl в буфере. Конечно, это не больше, чем запуск repl в оболочке. Что вы действительно получаете, так это возможность писать код в другом буфере, а с помощью привязки клавиш выбирать секспсы или более крупные единицы и выполнять их в ответе, чтобы увидеть, работает ли он. Также слизь дает вам удобные сочетания клавиш для общих задач. См. swank-clojure на github для получения дополнительной информации.

JohnJ, Вы можете сделать то же самое в Emacs. На самом деле эта фраза, вероятно, является тавтологией.

(add-hook 'after-save-hook etc.

Вот чей-то пример after-save-hook для git: https://gist.github.com/449668

person Gene De Lisa    schedule 17.04.2012

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

Вы можете использовать cake, чтобы избежать запуска JVM каждый раз при запуске тестов. Вы можете запустить cake test в командной строке или просто позволить Eclipse запустить его за вас, когда вы сохраняете любой файл в своем проекте.

Я заставил это работать, настроив проект с Leiningen, установив cake и установить против часовой стрелки Плагин Eclipse. Чтобы настроить Eclipse для запуска тестов при каждом сохранении, выберите Project->Properties->Builders, нажмите New, выберите Program, назовите это как-то вроде «запустить тесты», добавьте путь к cake в разделе Location, выберите рабочий каталог для вашего проект и добавьте test к необязательным аргументам. На вкладке «Параметры сборки» выберите «Во время автоматической сборки».

Я почерпнул общую идею из книги Джеффа Юнкера «Основы гибкой разработки Python». Я работаю с Emacs уже 20 лет, но в последнее время из-за этого трюка Eclipse оказался в центре моего рабочего процесса.


Обновление: примерно год спустя я теперь использую Midje с параметром lazytest, чтобы делать то же самое при разработке как с Emacs, так и с Eclipse.

person JohnJ    schedule 03.11.2011

«Когда я смотрю на примеры разработки в Clojure, они кажутся похожими на загрузку файлов в REPL, посмотрите, как они работают, отредактируйте файл, перезагрузите, повторите. Ни один класс или jar не генерируется где-либо… ... Я хотел бы услышать несколько примеров рабочего процесса от людей, которые создали несколько нетривиальных программ, которые будут использоваться обычными пользователями (а не другими разработчиками), если это возможно».

Примеры в Отладка функций clojure, которые вызываются в коде Java. (eclipse) тривиальны, но иллюстрируют, как в eclipse можно связать проекты, чтобы можно было вызывать функции clojure/scala из java.

person artella    schedule 31.08.2011