Clojure Development: IDE или REPL? - PullRequest
       30

Clojure Development: IDE или REPL?

18 голосов
/ 23 октября 2009

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

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

Это намеренно? Инструменты слишком незрелые или я просто не "понял"?

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

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

Ответы [ 7 ]

12 голосов
/ 23 октября 2009

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

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

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

Мой рабочий процесс выглядит так:

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

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

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

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

3.5 скопируйте их в REPL

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

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

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

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

9 голосов
/ 23 октября 2009

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

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

6 голосов
/ 23 октября 2009

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

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

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

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

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

4 голосов
/ 02 февраля 2011

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

Мой общий подход:

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

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

1 голос
/ 17 апреля 2012

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

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

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

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

Вот чей-то пример ловушки после сохранения для git: https://gist.github.com/449668

1 голос
/ 03 ноября 2011

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

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

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

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


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

0 голосов
/ 31 августа 2011

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

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

...