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

Използвам Clojure от известно време и искам да създам проекти, които са по-големи и по-сложни от играчките. Използвам Java през последните няколко години и свикнах с това, което IDE правят за мен -- компилирам много класове, пакетирам ги в буркани, създавам групови файлове, с които потребителите да ги стартират.

Когато гледам примери за разработка в Clojure, те изглеждат като зареждане на файлове в REPL, вижте как работят, редактирайте файла, презаредете, повторете. Не може да се генерира клас или буркан навсякъде. В страхотния „Програмиране на Clojure“ на Stuart Halloway не можах да намеря нито един пример за „:gen-class“, например. Clojure IDE, които съм използвал (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 въпроса:

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

B) Работен процес:

Моят работен поток е следният:

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

  2. започнете да пишете някои функции, които да го поддържат

2.5 копиране на дефинициите на функции в REPL, докато ги създавам

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

3.5 копирайте ги в REPL

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

  2. увийте вторичния файл най-ловко

Сега, когато се върна след месец, мога просто да си направя тестовете и да съм щастлив! Запазването на вашите 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 и други.

Що се отнася до изграждането на буркани и компилирането на 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 и swank clojure. След като навигирате до проекта, просто напишете M-x clojure-jack-in. Това стартира swank сървъра и slime се свързва с него и имате repl в буфер. Разбира се, само това не струва повече от изпълнението на repl в обвивка. Това, което получавате, е възможността да пишете код в друг буфер и с клавишно свързване да изберете sexps или по-големи единици и да ги изпълните в repl, за да видите дали работи. Освен това slime ви дава удобни клавишни връзки за обичайни задачи. Вижте swank-clojure в github за повече информация.

JohnJ, можеш да направиш същото в Emacs. Всъщност тази фраза вероятно е тавтология.

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

Ето нечий пример за след записване на кука за git: https://gist.github.com/449668

person Gene De Lisa    schedule 17.04.2012

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

Ще искате да използвате cake, за да избегнете времето за стартиране на JVM всеки път, когато стартирате вашите тестове. Можете да стартирате cake test от командния ред или просто да накарате Eclipse да го изпълни вместо вас, когато записвате който и да е файл във вашия проект.

Накарах това да работи, като настроих проект с Leiningen, инсталирах торта и инсталиране на обратно на часовниковата стрелка Плъгин Eclipse. За да настроите Eclipse да изпълнява тестове всеки път, когато записвате, изберете Project->Properties->Builders, щракнете върху New, изберете Program, наречете го нещо като „run tests“, добавете пътя към cake под Location, изберете Working Directory за вашия проект и добавете test към незадължителните аргументи. В раздела „Опции за компилиране“ изберете „По време на автоматични компилации“.

Получих общата идея за това от книгата на Jeff Younker, „Основи на гъвкавата разработка на Python“. Бил съм човек на Emacs от 20 години, но този трик постави Eclipse начело на работния ми процес напоследък.


Актуализация: приблизително една година по-късно сега използвам Midje с най-мързеливата опция, за да правя същото, докато разработвам с Emacs и Eclipse.

person JohnJ    schedule 03.11.2011

„Когато гледам примери за разработка в Clojure, те изглеждат като зареждане на файлове в REPL, вижте как работят, редактирайте файла, презаредете, повторете. Никъде не се генерира клас или буркан..... .Бих искал да чуя някои примери за работен поток от хора, които са създали някои нетривиални програми, които да се използват от редовни потребители (не други разработчици), ако е възможно."

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

person artella    schedule 31.08.2011