Вопрос

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

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

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

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

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

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

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Ну, для начала, практически любой приличный плагин разработки для любого редактора или 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 для вас, если вы об этом попросите. Я уверен, что более сложные вещи, к которым вы привыкли, будут добавлены в будущем. Они действительно все еще довольно новые.

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

    Мой общий подход заключается в следующем:

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

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

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

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

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

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

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

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

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

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

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

    <Ч>

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

      

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

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

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