Лисп - семейство языков программирования. Характерные особенности лиспов: динамичность, гомоиконность (код как данные), программируемость.
Основные диалекты — Common Lisp - разрабатывался как промышленный язык, пригодный для широкого спектра применения, из-за чего имеет достаточно объемную спецификацию. Является мультипарадигменным (процедурщина, функциональщина, ооп (CLOS)), с сильной, динамической типизацией. Есть опциональная декларация типов и, в некоторых реализациях (sbcl, например), частичный их вывод. Описание особенностей: http://habrahabr.ru/post/143490 Основные реализации: + свободные: SBCL (нативный код), Clozure CL (нативный код), ECL (через сишку), Clisp (байт-код; небольшой размер образа; похоже, заброшен), Clasp (llvm; ориентирован на интероп с c++), ABCL (байт-код JVM), gcl, cmucl + коммерческие: LispWorks, Allegro CL, Scieneer CL, mocl (для программирования под ведро и ios) — Scheme - это минималистичный лисп, пригодный в основном для обучения, исследований. Тем не менее Racket, вполне практичен. Racket включает в себя много подъязыков (typed racket, lazy racket, frtime racket), включая схему стандартов r5rs и r6rs. — Clojure - Стильный, модный, молодежный лисп с бóльшим уклоном в функциональщину, иммутабельными структурами данных, поддержкой параллельщины с транзакционной памятью, агентами. Ориентированность на JVM сильно отразилась на дизайне языка, что многим не нравится. — Emacs Lisp - его область применения ограничивается емаксом. Является наследником ТОГО САМОГО MacLisp'а. — Tcl - скриптовый язык, оче удобен для написания скриптиков с окошками или edsl — Rebol — PicoLisp - Наркоманская хуита — newLISP - Скриптовый лисп с компактным и быстрым интерпретатором и батарейками на любой случай жизни. В первую очередь предназначен для скриптоты, которую обычно пишут на perl, python, tcl, sh: обработка текстов, работа с сетью, базами данных, взаимодействие с ОС, построение графиков и т.п. Список возможностей: http://www.newlisp.org/index.cgi?Features Отличия от других диалектов: http://www.newlisp.org/index.cgi?page=Differences_to_Other_LISPs
Среды разработки Одно из основных преимуществ лиспа в сравнении с языками с циклом разработки "написал → перекомпилировал → запустил в отладчике" - поддержка интерактивно-итеративного метода разработки. Но без инструментария, обеспечивающего полноценное взаимодействие с реплом, оно сводится на нет. Поэтому писать без использования нормальной среды - значит упустить важную особенность языка.
— Common Lisp + Emacs + SLIME - самый лучший вариант. + vim + SLIMV + LispWorks + AllegroCL IDE упаси боже + Eclipse + cusp + <Что-нибудь для сублайма/атома уже запилили, наверное?>
>>565050 Область применимости newlisp ограничивается скриптотой. К тому же, он интерпретируемый и вообще ебанутый недолисп Алсо, если не устраивает размер sbcl, существует куча других реализаций. Тот же ACL умеет вычищать рантайм от неиспользуемых пакетов и компилятора.
>>565512 Это кнопочка ЕНТЕР. Алсо, нахуя ты пишешь код в репле? Пиши о обычном буфере, потом отправляй в репл по функциям, регионами или сразу целым буфером.
Много думал, читал, опять думал. И в конечном итоге пришел к выводу, что лисп единственный божественный яп. Все остальное жалкое подобие. Метапрограммирование, абстракции. Кароч, думаю вкатываться в мир илитки. Сам ни разу не программист, но учился, в ооп могу, лисп изучал, пролог. Годного посоветуйте пачаны. Спасибо П.с. Sicp читаю
Вопрос от ньюфага. Не совсем понимаю зачем нужен elisp. Ну да, он часть емакса, но он же больше нигде не используется? Нельзя ли прикрутить к емаксу sbcl, например?
>>566769 >Нельзя ли прикрутить к емаксу sbcl, например? Можно, но >он часть емакса Емакс придется почти полностью переписать. Алсо, что ты будешь делать с миллионами строк расширений на elisp'е? Можно, конечно, запилить слой совместимости, но проделать одному всю эту работу практически нереально.
Блядь, да что с этим рэкетом? Запускаю его в гейзере, а он, сука, начинает жрать процессорное время. То ли из-за автодока, то ли из-за чего-то другого.
>>568162 Автокад. Короче, оччень древние проекты, которым требовался скриптовый язык, и все писали собственные велосипеды. Лисп, понятное дело, на коленке сделать в разы проще, чем пых. Но сейчас, в век эмбедящихся пыхов, оно уже не нужно.
>>568194 > Кому то это надо? А ты думаешь что программирование ограничивается только вебом или клепанием очередного фоллаута? Если так, то лисп тебе ни к чему. А вот если ты будешь делать систему принятия решений, например, то без лиспа оче сложна будет.
Хули документация у рэкета - такая параша? Уже, блять, не альфа, не бете, не первая и даже не вторая версия, уже ШЕСТАЯ, ШЕСТАЯ нахуй, а документация до сих пор в полунаписанном состоянии. Алсо, тормозит он - пиздец. Чую, ещё чуточку поковыряю и он меня окончательно заебёт.
>>567100 разговоры за то чтобы дополнить (не заменить) elisp идут давно один из самых легко реализуемых добавлений будет guile в gsc2014 это делали https://www.google-melange.com/gsoc/project/details/google/gsoc2014/bpt/5803402760028160 есть обсуждение на вики но как это это пока не взлетело а ведь на самом деле это будет очень удобно - можно будет запиливать новые модули на схемке (в том числе и собственную обычную кастомизацию или какие собственные пользовательские скрипты) так же можно было бы потихоньку начать переписывать уже существующие модули с elisp на схемку потому что по большому счету elisp как язык - то еще говнецо, когда пишешь на нем, постоянно кислое лицо, когда еще знаешь что существует r5rs и r6rs схемки и standart lisp
>>568296 Guile? В емаксе? Нахуй он там нужен? Елисп, конечно, говно, но меняеть его на этот огрызок нет никакого смысла. Ещё и самую медленную реализацию выбрали. Лучше бы FFI и многопоточность пилили, а не этой хуйней занимались.
>>568297 чем читаешь то? не заменять, а добавить еще один скриптовый язык (guile) вдобавок к elisp необходимость в этом назрела давно по сути, нужна такая же эволюция, как случилось много лет назад - макросы teco были дополнены, а потом заменены elisp
>>568162 Clojure сейчас много где используется. Из популярных "инфраструктурных" проектов: Apache Storm - распределенная система обработки данных в реальном времени Puppet - автоматизация деплоймента и управления конфигурацией Datomic - база данных
Алсо, много американских стартапов используют Clojure для бэкенда или веба (ClojureScript): Farmlogs, Climate Corporation, Factual, Prismatic. Из крупных компаний в использовании Clojure замечены Wallmart и Amazon.
Да, блядь, как этот ебучий емакс настроить??? Везде на скринах вижу запущенный нормальный slime, а не убогий репл sbcl'a. Он может и не убогий, но, блядь, при опечатке C-d не работает, как работает в консольке.
>>568501 Тебе бы тупое ебло разбить, чтобы не задавал идиотских вопросов, а открыл и прочитал ёбаный ридми. >>568500 Что, блять, сложного в слоях? Тебе даже знать нихуя не надо: нажал ебучую кнопочку (рис. 1), нашел интересующий тебя слой (рис. 2) И ЧИТАЕШЬ ЕБАНОЕ ОПИСАНИЕ СЛОЯ, ГДЕ ДЛЯ САМЫХ УМЕСТВЕННО ОТСТАЛЫХ ВСЁ РАСПИСАНО. И что тут сложного? Даже в ссаном эклипсе больше ебатни с расширениями, чем тут. >>568498 Ты его через M-x run-lisp запускаешь что ли?
>>568542 > Ты его через M-x run-lisp запускаешь что ли? run-inferior-lisp А ебаный slime вообще нихуя не запускается как на скринах из интернетов [CL-USER]>
>>568563 Да, точно активирован. Мне чот казалось, что при установленном слайме lisp-mode как основной режим не используется. В общем, запускай M-x slime или C-M-m s i
>>568627 https://github.com/apache/storm Если что, на Джаве там только АПИ для Джавы. Да, АПИ на Джаве по объёму больше, чем сама система, написанная на Clojure. Вот такая вот Джава многословная и такой Clojure компактный.
>>568546 Что тебе там не понравилось-то? Функция add-entry? Реквестирую функцию добавляющюю файл в tar.gz архив на твоём любимом языке программирования.
(defun add-entry (archive filename) (with-open-archive (tar archive :direction :output :if-exists :append) (with-open-file (file filename :element-type '(unsigned-byte 8)) (let ((entry (create-entry-from-pathname tar filename))) (write-entry-to-archive tar entry :stream file))))) [/code] В который раз убеждаюсь, что с библиотеками в общелиспе далеко не так плохо, как говорят.
да вы ебанутые с чего начинать? да начинать сразу делать настоящее приложение: положим эмулятор терманала, ftp сервер или клиент и прочее ну то есть то, что известно как делать
>>568794 Хм, на ЛОРе, кажется, была новость про перевод, но сейчас нагуглилось только кусками с лиспер.ру. Может к следующему перекату запилим репу с книгами?
>>568822 >Иммутабельные коллекции, STM, CSP, трансдьюсеры, core.logic - это все синтаксис для Явы? Нет, это главы учебника по кложуре, которые обычно, судя по коду, пропускают за ненадобностью.
>>568837 Я-то тут причем? Код же кложуристы пишут, а не я. Почему они предпочитают ебать всякие ArrayList вместо кложурных коллекций - для меня загадка.
>>568859 Чому ты так бугуртишь? Открывай рандомный файл практически любого кложе-проекта и гитхубе и дивись - жава-макакам завезли нового, модного синтаксиса со скобочками. Скала хотя бы на всё это говно гармонично ложится, а вот у кложуры так не получается - слишком разные.
>>568859 Ты мне лучше скажи, знаешь ли ты хотя бы один полноценный проект на кложе? Именно на кложе, а не яве со скобками. Всякие библиотеки для вычисления факториалов не снимая свитера и прочие трансдюсеры не в счёт.
>>568863 > Открывай рандомный файл практически любого кложе-проекта и гитхубе Ты окончательно теряешь связь с реальностью.
В Гитхабе есть поиск по коду. Вводишь там ArrayList, выбираешь язык Clojure - и вуаля, 0 результатов.
И на то есть причины: 1. Встроенный PersistentVector легче создать - [1 2 3] вместо (java.util.ArrayList. [1 2 3]) 2. Если для супер-производительности нужна мутабельность, то есть transient 3. PersistentVector можно передовать в вызовы джавовских библиотек прямо так, поскольку он реализует все стандартные джавовские инетрфейсы (Collection, List и т.д.)
>>568864 > Всякие библиотеки для вычисления факториалов не снимая свитера и прочие трансдюсеры Трансдьюсеры - часть стандартной библиотеки. Тебя уже не остановить, ты обсираешься по кд.
Список проектов тебе скинули выше. Напоминаю, что на гитхабе есть поиск по коду, в нём ты найдёшь ещё больше проектов.
>>569184 Потому что можнозделать! Напиши ридер-макрос, который позволяет делать так: #~(f 1 @ 3), и чтобы оно парсилось в лямбду с одним параметром, кототрая внутри подставляет его вторым аргументов в f. Потом доделай чтоб можно было так: #~(f 1 @2 3 @1) - чтобы 2 аргумента и второй подставлялся первым и тд. Поверь, все читатели твоего кода и пользователи твоей библиотеки оценят твою изобретательность! Lisp-way! Вот здесь есть примеры подобного: http://clhs.lisp.se/Body/f_set__1.htm
>>569194 Лол, как тебя вообще в лисп занесло такого? Лисперы пишут dsl'и на каждый чих. Для описания лямбд, для описания циклов, свои объектные системы, и так далее. Если в языке вообще есть гибкие и удобные макросы - там уже будет "каждый ебаный мудак будет делать свой костыль", но в лиспе это практически сама парадигма.
>>569184 Во-первых, они в общелиспе малоиспользуемы. loop/iter предпочтительнее, чем map/mapc/mapcar/etc или reduce. Во-вторых, если нужно, то используй ридер. Таковой есть в rutils, например.
А теперь посмотри внимательно на эти результаты. Что ты там видишь? Правильно, туториалы по интеропу Clojure с джавой. А также какие-то юнит-тесты для старого плагина под Идею. Ни одного настоящего проекта неписанного ненаркоманом там нет (по причинам, которыя я обозначил выше).
>>569184 В cl21 мне понравился ридер #' #'(and integerp (or oddp zerop)) => (conjoin #'integerp (disjoin #'oddp #'zerop)) #'(not fn) => (complement #'fn) #'(compose f g) => (compose #'f #'g) Из последнего, по-моему, можно было бы и убрать compose
>>569226 Успокойся уже, евангелист. Тот факт, что на кложуре пишут как на яве со скобочками ты пропустил, зато прицепился к ArrayList, который использовался как имя нарицательное, и стал с яростью опровергать. Типичное поведение фанатика.
>>569226 Ну, во-первых, плагин не такой уж и старый, вчера обновлялся, пускай даже его и заменяют новой IDEшечкой. Во-вторых, говорить, что там только юнит-тесты и туторы -- правильно, но ты всё равно скрываешь, что там есть и нормальный код.
>>569236 Как ты умело подменяшь предмет дискуссии. Я привёл (неполный) список вещей, который есть в языке и которые полностью меняют подход к программированию. > Иммутабельные коллекции, STM, CSP, трансдьюсеры, core.logic Ты, с высоты своего глубокого познания, заявил, что это всё неиспользуется. Дополнил ты это метким замечанием, что вместо PersistentVector в кложе принято использовать ArrayList. Это всё говорит о том, что ты не имеешь не малейшего представления ни о языке, ни о том как на нём пишут. Всё что у тебя есть это услышанное где-то клише "ява со скобочками", которое ты повторяешь как заклинание.
>>569239 Да нет там нормального кода, я же писал выше почему. Единственная причина использовать ArrayList в Clojure - это использование ява-библиотеки которая принимает в качестве аргумента только ArrayList (а не List или Collection) - что является в яве дурным тоном.
>>569276 Вот опять ты, как и полагается фанатикам, пропустил мимо ушей основной тезис и гнешь палку совершенно в другом направлении. > и которые полностью меняют подход к программированию. Айлол, да не смеши. Вот этот подход https://github.com/puppetlabs/puppetdb/blob/master/src/puppetlabs/puppetdb/archive.clj ничем не исправишь. И он является основным для кложуры. Кстати, ты так и не ответил >знаешь ли ты хотя бы один полноценный проект на кложе? Именно на кложе, а не яве со скобками.
>>569311 > ты меняешь показания. Где я их меняю, интересно? То что я по гитхабу неправильно искал? Ну я признаю это, я об этом и написал. Но ты успокоился, это главное.
Скобконы, как то видел туториал, там делали толи текстовый квест, толи рогалик, вроде бы на clojure. Оформлено в виде онлайн-книги. Ссылку проебал, может поможете найти?
>знаешь ли ты хотя бы один полноценный проект на кложе? Именно на кложе, а не яве со скобками. Уже отвечал. Бери любой проект на кложе из топа гитхаба и смотри. Только что ты понимашье под "джава со скобками"? Использование джавовских библиотек?
Пощупал этот ваш newlisp. Сначала оче понравилась изкоробочность, как оказалось, далеко не всего необходимого для скриптования, простота использования, двим на уровне перла, но когда дело дошло до скриптов чуть серьезнее, вскрылось много неприятных особенностей. Например, нет нормальных словарей, вместо них ассоциативные списки и контексты. Первые неэффективны и не слишком удобны в использовании (добавляются элементы с помощью push, а не (setf (lookup key table) value)), а вторые имеют глобальное имя и накладывают некоторые ограничения на ключ, т.к. он используется как имя переменной внутри контекста (контекст:ключ = значение). Также были обнаружены какие-то странные ограничения на длину строк, проблемы с производительностью при обработке не крошечных, но и не больших объемов данных: например, время обработки строки функцией parse возрастает никак не линейно. К тому же, подпортил впечатления guiserver.jar, который успешно создавал окошко, но ничего в нём не рисовал/отображал.
Делал все по этой инструкции http://habrahabr.ru/post/259737/ и запускаю хэлоуворд на пике. С емаксом мэйкфайлами и лиспом ни разу не работал. Как правильно программы запускать? Это же интерпретатор, а не компилятор и не редактор. Куда жать чтобы скомпилировать? Иди как в консоли это сделать?
>>571377 В коммон лиспе всё иначе, чем в других компилируемых языках. Компилятор здесь - часть лисп-системы, рантайма именно поэтому он такой же программируемый, как и любая другая часть языка, а не отдельная сущность. И комиляции, как отдельной стадии, по сути не существует. Чтобы скомпилировать/перекомпилировать функцию через slime, достаточно нажать C-c C-c, тогда он отправить в репл что-то вроде (defun foo ...) (compile 'foo). Если ты хочешь сделать исполняемый файл, то нужно сохранить образ рантайма. В sbcl это делается с помощью функции sb-ext:save-lisp-and-die http://sbcl.org/1.0/manual/Saving-a-Core-Image.html , но есть и более удобные решения, такие как roswell (ros build "имя файла") https://github.com/snmsts/roswell или cl-launch http://cliki.net/cl-launch
>>571419 >Щас попробую. На самом деле, не стоит тебе сейчас с этим заморачиваться. Исполняемый файл обычно делают, когда уже всё готово. А некоторые даже не делают, а продолжают запускать через репл >>571422 Запусти slime ( M-x slime )
>>571433 >Эм большое это что? Alt >Мне с лиспом пару дней поиграться, а там 400 страниц. Без чтива разбираться ты дольше будешь. К тому же, никто не обязывает тебя читать полностью.
>>571462 M-x (альт икс твой) вызывает командную строку (ты ее снизу в минибуфере видишь), которая позволяет тебе выполнять разное. Тебе нужно нажать M-x набрать в минибуфере slime и enter.
>>571465 >>571471 Выскочила вторая консоль в которой можно запускать программы, а писать их там не удобно. Как сделать чтобы я писал их в обычном буфере для набора текста, а запускались они там?
>>571485 Когда находишься в буфере с текстом, поищи в меню режима (SLIME) что-то вроде send region, send line, send s-exp и т. п. И там будет написано сочетание клавиш.
>>571497 C-c : Read a single Lisp expression in the minibuffer, evaluate it, and print the value in the echo area (slime-interactive-eval). C-x C-e Evaluate the Lisp expression before point, and print the value in the echo area (slime-eval-last-sexp'). C-M-x Evaluate the toplevel form containing or after point, and print the value in the echo area (slime-eval-defun). C-x C-p Evaluate the Lisp expression before point, and pretty-print the value(s) into a new display buffer (slime-pprint-eval-last-expression). M-x slime-eval-region Evaluate all the Lisp expressions in the region. M-x slime-eval-buffer Evaluate all the Lisp expressions in the buffer. C-x M-e Evaluate the Lisp expression before point, print the value in the echo area and display the output buffer (slime-eval-last-expression-display-output). C-c C-u Remove the function binding for the symbol at point (slime-undefine-function).
>>571497 1. Открываешь файл с расширением .lisp 2. Пишешь туда свою хуйню 3. Тыкаешь С-с С-с это эвалит твою хуйню в репл 4. Тыкаешь C-c C-z или M-x slime 5. В репле вызываешь свою хуйню 6. ??? 7. Выгода
>>571510 C-c C-c используй для defun, defstruct, defclass и прочих def Просто для выполнения кода C-c C-e или C-c C-r (последний для выделенной области)
>>571513 Что-то с C-c C-c не то. Но C-c C-e выводит второй пик и нормально выполняет ведённые команды. Если выделить весь код и нажеть C-c C-r то всё работает.
> портирование на архитектуру ARM64/Linux (есть возможность запускать на Android платформе) > новая реализация интерпретатора, который по возможностям превосходит уже существующий SB-EVAL (быстрее в 20 раз). По-умолчанию он выключен, но шаги для его активации описаны в файле src/interpreter/README.
> Steel Bank Common Lisp (SBCL) — одна из реализаций языка программирования общего назначения Common Lisp. SBCL отличают высокая производительность генерируемого компилятором кода. Исходные коды открыты под смешанной лицензией BSD-style и public-domain. > http://www.sbcl.org/news.html
>>572390 Наверное, самое интересное здесь вот это > новая реализация интерпретатора, который по возможностям превосходит уже существующий SB-EVAL (быстрее в 20 раз)
>>572401 >As with sb-eval, the SB-EXT:EVALUATOR-MODE variable can be set to :INTERPRET or :COMPILE. >The REPL defaults to :INTERPRET if :sb-fasteval is enabled. Вот оно что. В общем, ускорение может быть в тех случаях, когда компиляция во время выполнения занимала непозволительно много времени, а простая интерпретация не давала нужной производительности.
>>572408 Врядли там jit используется. Просто теперь есть и быстрый интерпретатор. Дело в том, что процесс компиляции в sbcl занимает довольно много времени из-за кучи оптимизаций, что не всегда оправдано: например, если ты в рантайме генерируешь код, время исполнения которого соизмеримо со временем компиляции. Теперь появился второй стул: быстрый интерпретатор.
>>572411 Я понимаю только то, что лисп это вообще какая-то другая планета. Серьезно, пытаюсь понять что здесь и как, но это совершенно _иное_, от привычных яп. Хоть компилируемых, хоть интерпретируемых. Но, сука, как же манит.
>>572418 На самом деле всё просто: - Программа исполняется по одному экспрешену. Экспрешен это всё что внутри пары скобок на самом верхнем уровне. - Каждый экспрешен проходит следующий путь: 1. Read - чтение. Преобразует текст в структуры данных. В случае старых лиспов это только списки. На этом этапе работают reader macros. 2. Macroexpand - разворачивание макросов. Структуры данных, представляющие код, трансформируются, согласно правилам которые ты (или кто-то другой написал). Прелесть лиспов как раз в том, что при написании макросов ты работаешь с обычными структурами данных (а не хитровыебанным AST API), и у тебя для этого доступны все те же средства языка, которые ты используешь для работы с данными внутри программы. 3. Eval - исполнение. Преобразованные структуры данных (представляющие код) передаются на исполнение. По сути не важно, интерпретация это, компиляция с последующим выполнением, или что-то гибридное (например, jit).
Эта модель валидна во всех случаях. Не важно, работаешь ты в REPLе или скармливаешь компилятору десяток файлов сразу. Именно в её рамках и стоит рассуждать.
>>572898 Старый sb-eval и правда пиздец какой медленный: Интерпретация sb-eval'ом:[code] Evaluation took: 13.176 seconds of real time 13.780000 seconds of total run time (13.780000 user, 0.000000 system) 104.58% CPU 16,250,012 forms interpreted 22,530,968,640 processor cycles 212,020,040 bytes consed [/code]
Компиляция: [code] Evaluation took: 0.362 seconds of real time 0.000000 seconds of total run time (0.000000 user, 0.000000 system) 0.00% CPU 1 form interpreted 5 lambdas converted 619,318,248 processor cycles 38,787,320 bytes consed [/code]
>>572905 fasteval: [code]Evaluation took: 1.371 seconds of real time 1.324000 seconds of total run time (1.312000 user, 0.012000 system) [ Run times consist of 0.052 seconds GC time, and 1.272 seconds non-GC time. ] 96.57% CPU 3 forms interpreted 2,345,886,528 processor cycles 40,088,000 bytes consed[/code] На этом примере в 10 раз быстрее. Охуеть.
>>574067 Ну я eshell'ом постоянно пользуюсь для простых вещей. Но если мне надо захуячить разовый скрипт, я открываю rxvt и пишу скрипт в нем на zsh. Можно, конечно, открыть ansi-term и писать скрипт в нем. Но мне хочется попробовать хуячить такие одноразовые скрипты именно на eshell. Ибо от диалекта sh хочется блевать в основном.
>>574457 Что ты понимаешь под вебом? Если серверную сторону, то в современной веб-разработке нужны только REST-сервисы, т.е. подойдёт любой язык, который имеет HTTP-middleware и умеет общаться с базой данных. Так что тут нечего выпендриваться, даже nodejs сойдёт. Если ты имеешь в виду браузер, то единственный жизнеспособный вариант - это ClojureScript, его действительно используют в продакшене многие стартапы (некоторые даже опенсорсят свой продакшен код, лол: https://github.com/circleci/frontend) Но надо понимать некоторые вещи про ClojureScript: 1. Это 100% экосистема React. Соответственно, для любого проекта, для которого React будет оверкилом, ClojureScript будет ещё большим оверкилом. 2. ClojureScript + какая-нибудь обвязка для React (Om/Reagent/Rum) + Secretary + Figwheel даёт некоторые преимущества перед стандартным React стэком (React + Immutable.js + Redux + React-router + Webpack), но так же имеет и некоторые недостатки по сравнению с ним. Так что тут получается шило на мыло. Имеет смысл писать на ClojureScript только если у тебя бэкенд на Clojure.
>>574668 >Если ты имеешь в виду браузер, то подойдёт любой язык, который транслируется в js и умеет работать с dom. Так что тут нечего выпендриваться, даже js сойдёт.
>>574752 Не совсем так. Если ты, конечно, разделяешь один из тезисов статьи "Out Of The Tarpit", о том что основной источник accidental complexity - это управление состоянием. Суть в том, что современный бэкенд - это просто прослойка между браузером и базой данных, которая проверяет аутентификацию и транслирует запросы от браузера в запросы к базе данных. Никакого управления состоянием там нет, всё управление состоянием в базе данных. А вот во фронтенде управление состоянием есть, поэтому тут важно выбрать подход, который минимизирует accidental complexity. Например, React. ну или мучительно ебать себя в жопу лапшой из коллбэков Жейквери, или скоупами и директивами Ангуляра, - тут никто не в праве тебе запретить
>>574845 Это интересный вопрос. Во многих местах вэб сейчас используют как полноценную платформу для приложений. Зачастую эти приложения имеют дело с визуализацией и исселдовательским анализом данных. Это не ограничивается google docs и 1C, в каждой предметной области есть по нескольку компаний, работающий над доменно-специфическим решением. Можно сколько угодно рассуждать на тему того, что вэб для этого не предназначен. Однако если взвесить все за и против: кроссплатформенность, отсутствие процесса установки и обновления, темпы и направление роста - вэб во многих случаях выигрывает у всех нативных платоформ.
Естественно, по-прежнему остаётся широкий класс веб-сайтов, которые являются документами/формочками. Таким сайтам даже React не нужен - vanilla js или какой-нибудь легковесный MVVM подойдёт (knockout, vuejs), можно даже с jquery поебаться, если толерантность уже выработалась.
Я могу как-нибудь посмотреть код функции, не залезая в исходники и дебагер? Вот например > (defun hello-coca4 (abu) (format t abu)) Как-то получалось вызвав преднемаренно ошибку, увидеть код функи, но сейчас повторить не могу.
Можно получить объект-макрос из слота символа с помощью (macro-function 'defun), но в стандарте вроде бы никаких функций для работы с ним нет, но можно расковырять инспектором или воспользоваться специфичным для реализации средствами. Но только зачем?
>>577056 Но я не хочу поднимать стартап. Я хочу сидеть как раб в офисе в 9 до 18 и вкалывать аки индус. При этом не писать всякие AbstractSingletonProxyFactoryNBean
>>577078 Есть вакансии, в которых описывается опыт в кложурь на одном уровне со скала, джява. То есть примерно так "Опыт на одном из языков: Go/Python/Scala/Clojure/Java", хотя вакансия как-бы для джява-макаки.
>>577098 >>577098 >Есть вакансии, в которых описывается опыт в кложурь на одном уровне со скала, джява. А ты что хотел? Кложура и есть джава, но с сахарком
>>577102 Я просто не понимат что они хотят от соискателя, вдруг там будут рассказывать сказки, а потом заставят писать на джяве. Это подстава подстав будет.
>>577144 Язык (это тот, что на бумаге), а не компилятор или реализация. >Clojure is designed to be a hosted language, sharing the JVM type system, GC, threads etc. Чувствуешь разницу?
>>577102 >>577102 > Кложура и есть джава, но с сахарком В трэде много раз поднимался этот вопрос, хочется его обсудить поподробнее.
Язык программирования состоит из собственно языка, рантайма (либо компилятора, либо и того и того вместе) и библиотек. Если два языка используют один и тот же рантайм и библиотеки, можно ли считать что один является "сахарком" для другого?
Языки вроде Питона и Руби имеют очень неэффективные рантаймы, и часто опираются на Сишные библиотеки. Можно ли назвать их "сахарком" для Си?
Вряд ли, прежде всего потому, что сам процесс программирования на этих языках разительно отличается от программирования на Си: отсутствие ручного управления памятью, интерактивная разработка, ООП парадигам вместо процедурной. Кроме того, Питон и Руби имеют реализации на других рантаймах, например на JVM.
Получается, что называть Руби и Питон "сахарком" для Си некорректно.
Теперь посмотрим на Clojure: - Принципиально другой процесс программирования: отсутствие ручного управления временем (прощайте ужасы concurrency), вместо объектов - данные и функции, вместо фреймворков библиотеки. - Работает на других рантаймах: JavaScript + куча маргинальных реализаций (.NET, Python, Ruby)
По той же логике, Clojure "сахарком" назвать нельзя. Это самостоятельный язык.
>>577676 Большинство на Емаксе пишут. Не знаю в какую категорию он попадает лично для тебя. Сам пишу в LightTable, он вроде умирал и я даже хотел перекатиться на Емакс, но недавно LightTable начал вновь подавать признаки жизни.
>>577712 Ты имеешь в виду CL vs Clojure? (Clozure - это вроде как одна из реализаций CL) Мало что могу сказать, т.к. с CL знаком только по книге Land Of Lisp, т.е. поверхностно. С точки зрения языка, основные отличия помещаются на одну страничку: http://clojure.org/lisps Главное отличие - нужно хотя-бы немного знать Джаву и уметь не охуевать от эксепшенов.
>>577823 Признайся, ты же ява-питек в прошлом? Какие полезные библиотеки на яве? Все эти полезные библиотеки - переоверинженереная хуита типа гибернейтов, которую проще переписать, чем использовать.
>>577619 Кое-кто путает язык и реализацию. >Языки вроде Питона и Руби имеют очень неэффективные рантаймы Насколько мне известно, это не так. У них неэффективные кодогенераторы, но с рантаймом всё в порядке. >Можно ли назвать их "сахарком" для Си? Нет. Вот если бы вместо объектов там были сишные указатели на структуры, а для обработки ошибок использовались errno и возврат нулевых указателей. Если бы все примитивы были заменены сишными: вместо строк char*, вместо чисел солянка из char, short, long, long long и т.д. Вроде и язык продвинутый, а писать на таком одно мучение, т.к. изо всех щелей выглядывает сишка. И всё это ради сомнительной цели, ради прозрачного интеропа.
>>578047 >Мне объяснить чем браузер лучше HTTP-клиента? Да, объясни. >По запросу nurpl гуглится пикрелейтед. Какой пользователь, такой и гугол. http://www.nuprl.org/ >Думаю не стоит. Я тоже так думаю. И не только про cl.
>>578052 >Да, объясни. Извини, я написал "Prowser", хотя следовало "HtmlUnit". Путаю их. Prowser действительно сравним с drakma в плане возможностей. Но вот HtmlUnit строит DOM, иногда исполняет JS и может в Ajax.
Что интересно, анон из лиспотреда является скобочным энтузиастом: готов помочь ньюфагам, обсудить преимущества и недостатки, написать (не)много лиспокода в конце-концов. Что приятно. И как же на его фоне в невыгодном свете выглядят сферические дрочащие на себя обезьяны из хачкель треда. Они способны лишь кричать во все горло о том, какой хацкель охуенный и вообще, все остальные не нужны, при этом не могут не то что ответить ньюфагу на вопрос иначе как "иди читай про 'неведомая-ебаная-хуйня, так еще и сами же не хотят писать на своем говне, объясняя это тем что язык то ленивый, и вообще вся эта ваша реальная хуйня не нужна. То ли дело подрочить на красивую теорию.
Знающие аноны, расскажите такую вещь. На ЛОРе есть пользователь с ником mv, он прогает на лиспе в крут ой американской конторе. Я не понимаю что он именно делает, но там как-то связано с VHDL, на лиспе вроде DSL какой-то, который потом перегоняется на VHDL, но я хз. Может тут кто-нибудь рассказать примерно, чем он занимается и почему для этого используют именно лисп?
>>579493 Няша, не помню точно, но на ЛОРе как-то поясняли, почему кложура не лисп, у него нет каких-то важных свойств, только синтаксис схож. Ради интереса можно попробовать там поискать или даже тему создать.
Раз тут обсуждают "что есть лисп", вброшу первый выпуск авторского веб-журнала про лисп: https://leanpub.com/readevalprintlove001/read Там как раз приведены разные точки зрения на этот вопрос, а также неплохой обзор существующих лиспов.
>>581318 Следуя той классификации, можно отнести кложуру к категории exo-lisps. >Exo-Lisps are the variants that exist to serve very pointed use cases. They can take the form of highly specialized libraries or embeddables >Likewise, Exo-Lisps may be embedded within existing applications, like Emacs Lisp, or act as extension frameworks like Guile, Visual Lisp and Elk.
>>581368 Мне вот интересно. У человека наверняка очень необычная позиция, раз он делает такие выводы. Хочется с этой позицией ознакомится для расширения кругозора.
Ребят, помогите с задачей. Требуется написать функцию на scheme, которая считает количество различных элементов в списке. Собственно, итерацию для нахождения длины списка я написал, но как задать с учетом различности чисел — не дуплю.
>>581619 А чем примитивами можно пользоваться? Самое очевидное решение - положить в set, но наверное set-ами пользоваться нельзя. Следующее по очевидности - отсортировать и потом в один проход выкинуть дупликаты, можно пользоваться сортировкой?
>>581664 Вариант с сортировкой, но только для чисел. Впрочем передать функцию для сравнения не сложно, но это не очень решение в целом. http://ideone.com/bWD1hP (defun count-unique-values-2 (list) (let ((sorted (sort (copy-list list) #'>)) (unique 0) last) (dolist (x sorted) (unless (eql last x) (incf unique) (setf last x))) unique))
>>582760 Racket, ставишь #lang R5RS Clojure слишком сильно отличается. Хотя есть проект переделки SICP под Clojure, но проект пока не завершён. Да и переделка довольно существенная.
>>582841 Проходить SICP нужно для расширения сознания. А реальные задачи можно хоть на javascript потом решать, книга от этого менее полезной не станет.
Можно ли вызвать функцию из терминала безо всяких if? Т.е. в предложенном варианте http://pastebin.com/hhnJQbsX после запуска я ввожу 'fun' в терминале и лисп выполняет функцию 'fun'?
>>583970 Смари, запускаю написанную на лиспе программку, в ней бесконечный цыкол (в примере его нет), который предлагает ввести название функции, которую надо выполнить. Собственно вводится "fun" в консоли и начинает выполняться функция "fun". >>583973 Немного совсем не то если я не жопой прочитал
>>584025 >А нахуя ты каждое ключевое слово с двоеточием пишешь? Так читабельнее. keyword'ы обычно другим цветом подсвечиваются. >>584025 >Убер простой вариант: http://ideone.com/ggsdrH У тебя там ошибки: будет падать с ошибкой от EOF, и есть возможность вызвать те функции, которые не следует.
>>584031 Ну дык это ж для демонстрации идеи. Как думаешь в чьем примере человеку который не осилил погуглить "common lisp call function by string" будет легче разобраться?
>>584077 Там по EOF выход, но ты можешь запилить сравнение строки, как тут >>584025, или сделать функцию commands::bye с нелокальным (throw в функции и catch за циклом) переходом на конец цикла. Ну или сигнальным протоколом воспользоваться и добавить ещё один случай в handler-case.
Надо сделать чтобы 1) Каждое выдаваемое имя было уникальным 2) При исчерпании доступных имен можно класть приложение в сегфолт 3) Имя должно выдаваться за постоянное время
>>585343 Один из товарищей сделал через gensym. Вот что ему сказали на это: >nteresting approach. I think that gensym will create invalid names very easily; and will do so in wonderfully implementation specific manners I'm sure. The spec just says 'decimal representation' of gensym-counter. So that might be any number of diigits.
>>585841 Не хватит сил и мотивации. А ещё, получится никому не нужное говно. Лучше помоги посонам с осовремениванием общелиспа. Например, cl21 более-менее неплохо зделоли. Но его нужно допилить и заняться оптимизацией: понатыкать компилер макросов, deftransform'ов и прочего.
>>585849 Просто мне не очень интересно пилить языковые фичи. У меня есть ряд идей по оптимизации такой низкоуровневой фигни как сборка мусора и транзакционная память, поэтому и хочется взять фронтенд от кложуры и приделать к нему бэкенд в LLVM или Си. Тем более что давно мечтаю о легковесной, компилируемой альтернативе питону на серверах.
>>585876 Просто взять "фронтенд от кложуры" не получится, потому что это хостед язык и там изо всех щелей подводная жава. >Тем более что давно мечтаю о легковесной, компилируемой альтернативе питону на серверах. Общелисп жи. 30мб образа заменяет все 80мб питона.
>>577619 ты уёбок. пиздец. ты сука значение слова рантайм узнай сначала. райнтайм!=виртуальная машина. в яве в рантайм включена виртуальная машина. пошёл нахуй, умник
"языки вроде Питона и Руби имеют очень неэффективные рантаймы" ты дебил?
"Язык программирования состоит из собственно языка, рантайма (либо компилятора, либо и того и того вместе) и библиотек." ты пиздец мудак у меня бомбануло
>>577619 "Кроме того, Питон и Руби имеют реализации на других рантаймах, например на JVM." Да что ж ты за сука такая! Какие бля нахуй реализации рантаймов? ран тайм это блядь среда выполнения. Даже у Objective C она есть. Она может быть с виртуальной машиной, а может и без. Хули ты тут ворвался такой. Кложура синтаксический сахар кстати, если интересно моё мнение.
>>585841 Вначале приведу аргументы против того, чтобы это делать: 1. Если ты собираешься делать проект в целях самообразования, то лучше выбрать язык попроще и поменьше. Например, Scheme. Выбрав Clojure ты рискуешь потонуть в несущественных для твоего образования деталях. 2. Если ты собираешься делать это ради результата, то тут есть масса возражений: a) Оно уже есть: https://github.com/schani/clojurec b) Сама идея Clojure подразумевает что язык делит с платформой GC и базовые типы (строки, числа и т.д.). В нативном коде ни общепринятого GC, ни общепринятой реализации иммутабельных строк нет. Именно поэтому Timothy Baldrige (один из разработчиков Clojure, автор core.async) вместо диалкета Clojure под нативный код сделал новый язык, просто позаимствов из Clojure основные идеи: https://github.com/pixie-lang/pixie c) В качестве лекговесной компилируемой альтернативы питону на серверах подойдут SBCL, Chicken Scheme, а также многие другие реализации CL и Scheme. А ещё, лично мне нравится OCaml.
Если ты всё-таки возьмёшься за этот проект, то план примерно следующий: 1. Найти GC. 2. Реализовать в нативной коде иммутабельные структуры данных на основе Hash-Array Mapped Tries. 3. Реализовать Transactional Memory на основе MVCC (Хикки говорил, что любая другая не подойдёт), а также другие concurrency примитивы: agent, atom, var (это уже гораздо проще). 4. Написать компилятор, за основу лучше взять компилятор ClojureScript, т.к. он сам написан на Clojure. Определиться, на какой платформе будешь бутстрапится: на JVM или на JS (тут я даже не знаю что посоветовать). 5. Реализуешь кодогенерацию для десятка (примерно) базовых специальных форм. После этого пытаешься скомпилировать core.clj, в котором определён весь остальной язык.
Что делать дальше я слабо представляю, там наверняка ещё есть куча нюансов. Лучше попробовать написать проект или портировать библиотеку, и смотреть какие проблемы вылезут.
>>586226 >Chicken Scheme Петушиная схема сдохла же. Из схем рэкет и гуиле более-менее живые. У второго вообще другое предназначение, а первый - жуткий тормоз.
>>586226 Не для самообразования, скорее просто for fun (а если получится еще и for profit - вообще замечательно). Репозиторий clojurec давно не обновлялся, да и там boehm GC, который говно. Я собираюсь использовать reference counting да, знаю что по производительности это будет хуже GC для удобной интеграции с нативным (сишным) кодом. OCaml мне тоже нравится, но у него однопоточный GC. И ебанутая лицензия на компилятор, которая отбивает все желание допиливать его рантайм.
>>586341 Существуют аж ДЖВЕ замены стандартной библиотеке. Что создает определенные проблемы если нужно, например, интегрировать две разные библиотеки, одна из которых использует lwt а другая async. Если хочется статической типизации, имеет смысл таки осилить haskell.
Erlang треда не нашёл, спрошу тут. Есть список вида [1,4,3,6,1,2,2,3,5] и т.п., нужно вернуть список туплов вида [{1,2},{2,2},{3,3},{4,1},{5,1},{6,1}], то бишь количество повторений каждого числа. Как это сделать на рекурсии?
>>589771 Не читал PCL, поэтому сравнивать не могу.
Land Of Lisp читается очень легко, потому что написана с шутками и картинками, задания по программированию все интерактивные и описывают разработку игр. Мне кажется, это актуально для любого уровня.
>>590458 В cl21 пытались реструктуризировать стандартную библиотеку, попутно собрав все батарейки в одном месте. Но этот проект пока только как прототип и для практического использования не слишком пригоден.
Ты лучше скажи, что именно тебе нужно, а мы насоветуем.
>>590470 Мне надо сделать генератор рейтингов. Есть postgres. Надо сделать выборку, и выплюнуть её в html. Алсо как лучше всего это дело прикрутить к nginx'у?
>>590472 Для работы с бд - postmodern либо cl-dbi и опционально sxql >Алсо как лучше всего это дело прикрутить к nginx'у? Всякие cgi-либы давно протухли. Лучше заюзай clack или какой-либо фреймворк поверх него (легковесный lucerne, например)
>>590472 >и выплюнуть её в html Есть edsl для генерации html - cl-who, есть google closure templates - cl-closure-templates. Выбирай сам в зависимости от сложности страницы и личных предпочтений.
>>590484 Хочу что-то типа такого: (html (body (table (th (td "#") (td "name")) (loop for name in names for i = 0 then (1+ 1) do (tr (td i) (td name))))))
Господа, начал учить лепса ANSI CL Пол Грэм и серьёзно озадачился, откуда взять словарь, шоб быстро посмотрел, за что отвечает эта блядская and, or или всякие предикаты типа atom.
>>592359 Редактор atom знаешь? Вот он использует электрон, обвязкой вокруг которого ceramic и является. Нахуя веб вытесняет десктопные тулкиты? Много причин.
>>592614 Я пока и сам не понял, нужен ли он. С одной стороны куча нативных тулкитов, которые либо не кроссплатформенны, либо не могут в нативный вид, либо просто крестоговно без аби и с собственным препроцессором. С другой стороны эта вебпараша. Криво тоже, тормозно, не может в интеграцию с DE, но зато кроссплатформенно, выглядит почти везде одинаково и более удобно для разработки и отладки (особенно, если использовать какой-нибудь clojurescript вместо js-говна).
>>592709 Как и лисповы скобочки, со временем приедается и видишь неправильные конфигурации. Да и в жсе множество комбинаций будут ошибкой и подсвечены тем же емаксом. А вот в лиспе можно проебать скобок тут и там, а код будет валидным. Сиди охуевай ищи почему не работает. Впрочем, опять-таки, это все дело привычки. Сишники так вообще первое время постоянно = и == путают.
>>592735 >А вот в лиспе можно проебать скобок тут и там, а код будет валидным. Для этого надо очень хитро объебаться со скобками. В жс это сделать уж намного проще.
>>592747 Я пока переписываю примеры из PCL и свой говнокод пилю уже не раз объебывался. Из-за того что этих скобо миллиард проебать в нужном месте легко. А чтобы не проебывать нужно чутье, которое вырабатывается только с опытом. Главное отличие от жс, в жс 90% будет синтаксическая ошибка, тогда как в лиспе будет либо рантайм ошибка, либо вообще просто логика по пизде пойдет.
>>592753 Ты код в блокноте писал что ли? smartparens из емакса сам заботится о скобках. А если уж ты и умудрился проебать, то при компиляции функции подсветится ошибка или предупреждение.
>>592757 В том то и дело, что я умудрился наступить на грабли когда емакс все расставил как надо, но при этом код оказался неправильным. Найди сходу ошибку: (defun score (features) (let ((spam-probs ()) (ham-probs ()) (number-of-probs 0)) (dolist (feature features) (unless (untrained-p feature) (let ((spam-prob (float (bayesian-spam-probability feature) 0.0d0)) (push spam-prob spam-probs) (push (- 1.0d0 spam-prob) ham-probs) (incf number-of-probs)))) (let ((h (- 1 (fisher spam-probs number-of-probs))) (s (- 1 (fisher ham-probs number-of-probs)))) (/ (+ (- 1 h) s) 2.0d0)))))
>>592771 Выравниванием пользуйся. В си-подобных без выравнивания тоже не разберешься. >Смысл в том что у меня баг был такого же типа, но без синтаксических ошибок, код просто возвращал неверные данные. Практически невозможно обосраться со скобками так, чтобы компилятор молча принял. Минимум будет предупреждение.
>>565035 (OP) Я снова к вам. Тут две очень простенькие задачки на Scheme пытаюсь решить, первая — сложить две матрицы, вторая — проверить, что все числа в матрице неотрицательны. Собственно, не могу понять, почему рэкет бугуртит.
>>592825 > (define (sum-matrix a b) > (map + a b))
Только что написал не для одномерного списка, но тоже чет не работает. (define (sum-matrix X Y) (map (lambda (rowX rowY) (map (lambda (x y) (+ x y)) rowX rowY)) X Y))
Лисп - семейство языков программирования. Характерные особенности лиспов: динамичность, гомоиконность (код как данные), программируемость.
Основные диалекты
— Common Lisp - разрабатывался как промышленный язык, пригодный для широкого спектра применения, из-за чего имеет достаточно объемную спецификацию. Является мультипарадигменным (процедурщина, функциональщина, ооп (CLOS)), с сильной, динамической типизацией. Есть опциональная декларация типов и, в некоторых реализациях (sbcl, например), частичный их вывод.
Описание особенностей: http://habrahabr.ru/post/143490
Основные реализации:
+ свободные: SBCL (нативный код), Clozure CL (нативный код), ECL (через сишку), Clisp (байт-код; небольшой размер образа; похоже, заброшен), Clasp (llvm; ориентирован на интероп с c++), ABCL (байт-код JVM), gcl, cmucl
+ коммерческие: LispWorks, Allegro CL, Scieneer CL, mocl (для программирования под ведро и ios)
— Scheme - это минималистичный лисп, пригодный в основном для обучения, исследований. Тем не менее Racket, вполне практичен. Racket включает в себя много подъязыков (typed racket, lazy racket, frtime racket), включая схему стандартов r5rs и r6rs.
— Clojure - Стильный, модный, молодежный лисп с бóльшим уклоном в функциональщину, иммутабельными структурами данных, поддержкой параллельщины с транзакционной памятью, агентами. Ориентированность на JVM сильно отразилась на дизайне языка, что многим не нравится.
— Emacs Lisp - его область применения ограничивается емаксом. Является наследником ТОГО САМОГО MacLisp'а.
— Tcl - скриптовый язык, оче удобен для написания скриптиков с окошками или edsl
— Rebol
— PicoLisp - Наркоманская хуита
— newLISP - Скриптовый лисп с компактным и быстрым интерпретатором и батарейками на любой случай жизни. В первую очередь предназначен для скриптоты, которую обычно пишут на perl, python, tcl, sh: обработка текстов, работа с сетью, базами данных, взаимодействие с ОС, построение графиков и т.п.
Список возможностей: http://www.newlisp.org/index.cgi?Features
Отличия от других диалектов: http://www.newlisp.org/index.cgi?page=Differences_to_Other_LISPs
Что читать?
— Common Lisp
+ Practical Common Lisp http://www.gigamonkeys.com/book/ или русский перевод — http://lisper.ru/pcl/
+ On Lisp http://www.paulgraham.com/onlisp.html
+ Common Lisp HyperSpec http://www.lispworks.com/documentation/HyperSpec/Front/ — стандарт языка
+ Art of Metaobject Protocol — подробное описание MOP и CLOS
Алсо, годная статья про проектирование eDSL'ей на CL http://swizard.info/articles/solitaire/article.html
— Scheme
+ http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html
+ Racket Guide
+ SICP (это скорее вводные лекции по программированию, а не учебник по схеме, но тоже пойдет)
— Clojure
+ Programming Clojure, 2nd edition (для новичков)
+ The Joy Of Clojure, 2nd edition (есть есть бэкграунд в Лиспе или ФП)
— Tcl/Tk
+ Официальный учебник http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html
+ Документация по tcl http://www.tcl.tk/man/tcl8.6/TclCmd/contents.htm и tk http://www.tcl.tk/man/tcl8.6/TkCmd/contents.htm
+ Статьи про Tcl и Tk на wikibooks с примерчиками https://en.wikibooks.org/wiki/Category:Tcl_Programming
+ TkDocs с примерами на tcl, perl, ruby http://www.tkdocs.com/tutorial/index.html
Среды разработки
Одно из основных преимуществ лиспа в сравнении с языками с циклом разработки "написал → перекомпилировал → запустил в отладчике" - поддержка интерактивно-итеративного метода разработки. Но без инструментария, обеспечивающего полноценное взаимодействие с реплом, оно сводится на нет. Поэтому писать без использования нормальной среды - значит упустить важную особенность языка.
— Common Lisp
+ Emacs + SLIME - самый лучший вариант.
+ vim + SLIMV
+ LispWorks
+ AllegroCL IDE упаси боже
+ Eclipse + cusp
+ <Что-нибудь для сублайма/атома уже запилили, наверное?>
— Scheme
+ Emacs + geiser
+ drRacket
— Clojure
+ Emacs + CIDER
+ LightTable
+ Vim-fireplace
+ Cursive Clojure (IntelliJ plugin)
+ Counterclockwise (Eclipse plugin)
— Tcl
+ Emacs + tcl-mode (только подсветка синтаксиса и простенькое взаимодействие с реплом, но жить можно)
Чтобы не пердолиться с емаксом, можно взять уже преднастроенный spacemacs ( https://github.com/syl20bnr/spacemacs ) или prelude ( https://github.com/bbatsov/prelude ).
Библиотеки
— Common Lisp
+ Quicklisp ( https://www.quicklisp.org/beta/ ) - CPAN из мира CL
+ Quickdocs ( http://quickdocs.org/ ) - документация по всем пакетам из quicklisp
+ Cliki ( http://cliki.net/ )
+ Обзор экосистемы общелиспа на швабре ( http://habrahabr.ru/post/265589/ )
— Scheme
+ Racket: http://pkgs.racket-lang.org/ и http://planet.racket-lang.org/
+ Chicken: http://wiki.call-cc.org/chicken-projects/egg-index-4.html
+ http://snow.iro.umontreal.ca/?tab=Packages
+ http://www.schemespheres.org/spheres