Разыскиваются либители Common Lisp
4476
25
Предлагаю пообщаться на тему Common Lisp, реальных проектов и переспектив использования этого языка.
Lisper
Ха ха. Вот перекосило то. Извините за орфографические ошибки в сабже и сообщении.
Lisper
А что это за зверь то? Как то давным давно слышал что то, а что конкретно - не в курсе :спок:
Lisper
Перспектив - 0. Ну не прижился язык, что поделаешь:хммм:
Сибиряк
Одной фразой, Лисп - это программируемый язык программирования. При этом - это динамическая среда программирования, которая позволяет вести разработку прямо на выполняющемся приложении не перезапуская его после исправления ошибок.

Главная фишка Лиспа, которую с трудом можно реализовать в других языках - это возможность поднимать язык до уровня приложения, в то же время как пишешь приложение спускаясь до уровня абстракций языка. То есть в идеале приложения на Лиспе пишуться на некотором Domain Specific Language, который создается специально для этого приложения.

Почему я когда-то обратил на Лисп внимание ? Мне очень интересна такая особенность Лиспа, что весь язык (включая мои новые определения), доступен и во время отладки, и во время выполнения. Это означает, что при отладке работающей программы, можно в качестве команд debuggerа использовать сам Лисп. Ну и рефлексия в этом языке просто поражает воображение, чего только стоит команда apropos, которая выдает идентификаторы определенных функций и переменных по частично заданному имени.

Язык это изобретен более 40 лет назад и за этот период сильно вырос во всех отношениях:
1) Хорошие реализации компилируют в маш.код
и позволяют оптимизировать код с помощью
явных объявлений типов переменных. Так что,
если вы слышали, что Лисп тормозной, это давно
неправда.

2) Почти все имеют очень шустрые сборщики мусора (Generational GC). Сборка мусора
происходит на ходу во время работы приложения,
никакого торможения не наблюдается.
GC в хороших Лиспах намного шестрее, чем в Java.

3) Хороший интерфейс с другими языками:
интерфейсы с Си, COM/ActiveX.
Можно генерировать обертки и к плюсам

4) Среды разработки стали довольно
дружественными и удобными,
на пример Allegro CL сильно смахивает на Delphi.

Есть конечно и проблемы, но они по большей части решаемы с примешиванием Си в нужной пропорции: http://www.paulgraham.com/carl.html
craxx
чЩ ПДОПЧТЕНЕООП РТБЧЩ Й ОЕ РТБЧЩ. рЕТУРЕЛФЙЧ РП РТЕДМПЦЕОЙСН РП ТБВПФЕ ДЕКУФЧЙФЕМШОП ОЕ ЧЙДОП, ОП ДМС УБНПУФПСФЕМШОПК ТБЪТБВПФЛЙ ЙМЙ Ч УМХЮБСИ, ЛПЗДБ НПЦОП ЧЩВЙТБФШ, РЕТУРЕЛФЙЧЩ РТПУФП РПФТСУБАЭЙЕ.сЪЩЛ ПЮЕОШ ДБЦЕ РТЙЦЙМУС, ФПМШЛП Х ОБУ ЕЗП ОЕУЛПМШЛП ЪБФНЙМЙ ЧУСЛЙЕ РПР-СЪЩЛЙ, ОП ЬФП ЧУЕЗДБ ФБЛ.
craxx
Перспектив - 0. Ну не прижился язык, что поделаешь:хммм:
Вы одновременно правы и не правы. Перспектив по предложениям по работе действительно не видно, но для самостоятельной разработки или в случаях, когда можно выбирать, перспективы просто потрясающие.Язык очень даже прижился, только его несколько затмили всякие поп-языки, но это всегда так. Однозначно, на Лиспе сегодня можно писать реальные вещи.
Lisper
Да я ничего против Лиспа не имею, мощный хороший язык, но не получил он распространение. В те времена, когда господствовали Паскаль и Си, трансляторы Лиспа были слишком тяжеловесны для ПК. А сейчас абсолютное большинство программеров привыкли к Паскалю и Си (и к их производным типа Явы).
craxx
Я надеюсь что, те кто реально интересуются Лиспом все же в Новосибе есть. Под Лиспом имеется в виду главным образом Common Lisp, например AutoLisp - это не совсем то. Есть, правда, лиспы, которые не соответствуют Common Lisp, но зато эффективно компиляют в Си массивные такие матричные расчеты.

И где ценители этого дела ? :Б?:
Вы бы примеры реальных проектов привели, со ссылками. Интересно всё-таки.

Сам я знаю только emacs-lisp, да и то не виртуозно.
ktak
Каких проектов то ? Моих что ли ? Я имел удовольствие пользоваться только бесплатными или недорогими лиспами, хотя периодически ковыряю и trial версии Allegro CL и LispWorks. Как правило дешевые лиспы имеют недостаточно оптимизирующий компилятор и/или отсутствие GUI библиотек. Например к Corman Lisp я написал более менее пригодную GUI библиотеку, она конечно не final release, но имея реальный проект ее можно заточить как угодно. Например написал программку для анализа движений глаз целиком на Лиспе с использованием этой библиотеки. Конечно я только учусь использовать CL и приходится преодолевать кое-где неудобства, связанные с привычками в С/С++.

Сейчас занимаюсь внедрением наших наработок по eye-trackerу в Corman Lisp: получение видео-потока с камер, анализ изображения с целью выявления позиции зрачка и головы, выделение фиксаций взгляда, показ стерео изображения и т.д.
Процессорожрущие компоненты цепляю из C/C++ через FFI, а связку и экспериментальный код пишу на Common Lisp. Пока особых проблем не вижу. Если этот proof of concept пройдет, то получится конструктор генерирующий релизное приложение, а то исследовательским программированием на С++ уже сыты по горло.

Ну а вообще по Лиспу проектов немало. Рекомендую посетить franz.com (сайт AllegroCL)раздел Success Stories и посмотреть, что делается на Лиспе. Если бы Franz Inc. распространяла свои продукты не по таким грабительским ценам, то их дельфи-подобную среду можно было бы широко использовать для любых проектов, в ней практически самый крутой компилер, FFI, COM и многое другое. Но к сожалению их ценовая политика зверская - 4500$ за Professional версию среды и более 10000$ заEnterprise, где есть CORBA и т.п. вкусности. Получше у LispWorks - 600$ за Professional Edition, на котором можно написать что угодно: есть FFI,COM,Common SQL,CAPI (хорошая GUI библиотека). В среде LispWorks редакторы наследованы от Emacs,
что позволяет расширять их функциональность, при этом все удобно для новичка по сравнению с Emacs. Ну там и остального добра вроде инспекторов объектов, просмотрщиков иерархий дофига и всяких отслеживателей изменений в коде имеется.

С пожеланиями
Lisptracker
Каких проектов то ? Моих что ли ?
:-) Нет, я не имел в виду именно Ваши проекты.

Но к сожалению их ценовая политика зверская - 4500$ за Professional версию среды и более 10000$ заEnterprise, где есть CORBA и т.п. вкусности.
А это многое объясняет. Выходит слишком большая цена если не разработки, то, по крайней мере, первоначального вложения в разработку.

А что Вы думаете о языке Prolog? Не пытались применять в своих проектах?
ktak
а язык Fort (или что то очень похожее) случайно не разновидность лиспа?
snufi
а язык Fort (или что то очень похожее) случайно не разновидность лиспа?
Нет, даже не однофамильцы:улыб:Forth отличается от Лиспа как Бейсик от С++.
ktak
оХ ОЕ ЧУЕ ФБЛ РМПИП. мЙГЕОЪЙС LispWorks Professional, ОБРТЙНЕТ, УФПЙФ ~1000$. б Corman Lisp У ПФМЙЮОЩН FFI УФПЙФ ЧУЕЗП 200$. рПД мЙОХЛУ CMUCL, ЛПФПТЩК РП НПЙН ФЕУФБН РП ВЩУФТПДЕКУФЧЙА РТБЛФЙЮЕУЛЙ ОЕ ХУФХРБЕФ уЙ, ЧППВЭЕ ВЕУРМБФЕО. еУФШ ЕЭЕ GNU CLISP Й НОПЗП ДТХЗЙИ РПРТПЭЕ. йЪ ОЕ Common LispПЧ УФПЙФ ПФНЕФЙФШ Lush, ЛПФПТЩК ЧРПМОЕ НПЦЕФ ВЩФШ МХЮЫЕК БМШФЕТОБФЙЧПК MathLab ДМС ЙУУМЕДПЧБФЕМШУЛПЗП РТПЗТБННЙТПЧБОЙС, ЛПНРЙМСЕФ Ч уЙ, РТЙЮЕН ЧУФБЧЛЙ ОБ уЙ НПЦОП ДЕМБФШ Ч МАВПН НЕУФЕ ЛПДБ - ВЕУРМБФОЩК.

рТП РТПМПЗ НПЗХ УЛБЪБФШ, ЮФП Allegro CL Ч УЧПЕК РПУФБЧЛЕ ЕЗП ЧЛМАЮБЕФ. рТЙНЕОСФШ ОЕ РТПВПЧБМ. дМС ПВЩЮОЩИ РТЙМПЦЕОЙК ПО ОБЧЕТОПЕ ОЕ ПЮЕОШ РПДИПДЙФ. иПФС РТПУЛБМШЪЩЧБМЙ ФХФ ТЕБЪХМШФБФЩ РП ФЕУФБН ОБ УЛПТПУФШ РТПФПФЙРЙТПЧБОЙС Ч ТБЪОЩИ СЪЩЛБИ Й Relational Lisp ЧУЕИ УДЕМБМ У ВПМШЫЙН ПФТЩЧПН, РПФПНХ ЮФП ЬФП мЙУР УП ЧУФТПЕООЩНЙ ЬМЕНЕОФБНЙ рТПМПЗБ.
Ну не все так плохо. Лицензия LispWorks Professional, например, стоит ~1000$. А Corman Lisp с отличным FFI стоит всего 200$. Под Линукс CMUCL, который по моим тестам по быстродействию практически не уступает Си, вообще бесплатен. Есть еще GNU CLISP и много других попроще. Из не Common Lispов стоит отметить Lush, который вполне может быть лучшей альтернативой MathLab для исследовательского программирования, компиляет в Си, причем вставки на Си можно делать в любом месте кода - бесплатный.

Про пролог могу сказать, что Allegro CL в своей поставке его включает. Применять не пробовал. Для обычных приложений он наверное не очень подходит. Хотя проскальзывали тут реазультаты по тестам на скорость прототипирования в разных языках и Relational Lisp всех сделал с большим отрывом, потому что это Лисп со встроенными элементами Пролога.
А не доводилось ли вам пробовать Аду?
ganymed
оЕФ ОЕ РТЙИПДЙМПУШ, РПЬФПНХ С Й ЙЭХ МАВЙФЕМЕК Common Lisp, Б ОЕ бДЩ ;-) оБУЮЕФ рТПМПЗБ ФХФ ЛФП-ФП УРТБЫЙЧБМ. рТПМПЗ СЧМСЕФУС УФБОДБТФОПК ЮБУФША РПЮФЙ МАВПЗП ЛПННЕТЮЕУЛПЗП ДЙУФТЙВХФЙЧБ. х Franz Inc. РТЙМБЗБЕФУС Л мЙУРХ рТПМПЗ, Х XAnalys РТЙМБЗБЕФУС KnowledgeWorks. ч ПВЭЕН ЧУЕ ЮФП ОХЦОП ЙНЕЕФУС, Б ФБЛЦЕ CommonSQL,CORBA,OODB Й НОПЗП ЮЕЗП ЕЭЕ.

рТЙГЕРМЕОБ ЛБТФЙОЛБ IDE LispWorks Ч ДЕКУФЧЙЙ.
ganymed
Нет не приходилось, поэтому я и ищу любителей Common Lisp, а не Ады ;-) Насчет Пролога тут кто-то спрашивал. Похоже Пролог является стандартной частью любого коммерческого дистрибутива. У Franz Inc. прилагается к Лиспу Пролог, у XAnalys прилагается KnowledgeWorks. В общем все что нужно имеется наряду с CommonSQL, CORBA и многими другими полезными дополнениями.


Блин. Достапи эти фокусы с кодировкой. Какого [пииииииииип] оно ее крутит ?
Picture of LispWorks IDE attached.

Kartinka IDE LispWorks priceplena.
Кто-нибудь смог посмотреть эту картинку?
Я - нет
ktak
Попробую из Оперы, похоже IE какую-то хрень при передаче прицепил в начало файла.
Перевод фрагмента статьи Пола Грэхэма

Что делает Лисп отличным от других языков

Когда Лисп был впервые реализован, он включал в себя 9 новых идей. Некоторые из них сейчас представляются сами собой разумеющимимся, другие можно увидеть только в более продвинутых языках и две - все еще есть только в Лиспе. Вот описание 9 идей, расположенные в хронологическом порядке заимствования их в мэйнстрим языках:

1.Условные выражения. Это конструкции типа if-then-else. Мы воспринимаем их в настоящий момент как данность, но, например, Фортран вначале их не имел. Он имел только условный goto близко связанный с машинными инструкциями.

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

3.Рекурсивные вызовы.Лисп был первый язык программирования, который это поддерживал.

4.Динамическая типизация. В лиспе все переменные фактически являются указателями. Значения имеют типы, а не переменные, присваивание и связывание переменных означает копирование указателя, а не того, на что он указывает.

5.Сборка мусора (автоматическое управление памятью).


6.Программы составляются из выражений. Программы на Лиспе - это деревья выражений, каждое из которых возвращает результат. Это контрастирует с Фортраном и большинством последующих языков, в которых есть разделение на выражения и операции. (прим. перев. В Си операциями можно считать все вызовы функций c void результатом).

В Фортране было естественным сделать такое разделение, иначе нельзя было строить вложенные операции. (прим. переводчика. То есть все команды шли в ряд и не было блоков типа функций и т.п.) А так как выражения использовались для математических расчетов не было смысла делать, чтобы все они возвращали значения, потому что оно далее не использовалось бы.

Это ограничение пропало с появлением блочно-структурированных языков, но было уже слишком поздно. Разделение между выражениями и операциями усилилось. Оно распространилось из Фортрана в Алгол и, затем, в оба его потомка.


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

8.Представление кода с использованием деревьев символьных идентификаторов и констант.

9.Весь язык доступен все время. Нет никакого различия между временем считывания, временем компиляции и временем выполнения. Вы можете компилировать или запускать на выполнение код во время считывания, считывать или компилировать во время выполнения программы и т.п..

Возможность выполнять код во время считывания программы позволяет пользователю перепрограммировать синтаксис Лиспа; выполнение кода во время компиляции является основой существования макросов; компиляция в время выполнения - основа использования Лиспа как языка расширения в программах типа Emacs (прим.перево. + AutoCad); и, наконец, считывание во время выполнения позволяет программам общаться, используя s-выражения -идея, которая недавно была переизобретена как XML.
Когда Лисп впервые появился, эти идеи долгое время не появлялись в обычной практике программирования, это было главным образом продиктовано слабым аппаратным обеспечением в конце 1950-х. Со временем, среднестатический язык, из списка популярных языков, постепенно эволюционировал в сторону Лиспа. Идеи 1-5 в данный момент распространенно используются. Номер 6 начинает появляться в мэйнстриме. Питон имеет подобие 7, хотя похоже в нем нет никакой синтаксической поддержки для этого.

Что касается номера 8, это может быть наиболее интересным. Идеит 8 и 9 стали частью Лиспа по случайности, потому что Стив Рассел реализовал то, что Маккарти никогда не намеревался реализовавывать. И эти две идеи, выходит, ответственны и за то, что Лисп странно выглядит, и за его уникальные возможности. Лисп выглядит очень странно, не потому что он имеет странный синтаксис, а потому что он не имеет синтаксиса вообще; вы пишите программы напрямую как деревья синтаксического разбора, в то время как в других языках этот разбор выполняется "за кулисами" и эти деревья состоят из списков, которые в Лиспе являются структурами данных.

Представление языка на основе его же собственных структур данных оказалось очень мощной вещью. Идеи 8 и 9 вместе означают, что вы можете писать программы, которые пишут программы. Хоть идея звучит причудливо, но это повседневная вещь в Лиспе. Самый общий способ для этого, применить нечто, называемое макросами.

Термин "макрос" не означает в Лиспе то же самое, что в других языках. Макрос Лиспа может служить в качестве чего угодно - от сокращенного представления выражения, до компилятора нового языка. Если вы хотите действительно понять Лисп, или хотя бы расширить свои горизонты как программиста, вам следовало бы побольше разузнать про макросы.

Макрос (как он понимается в Лиспе) все еще, насколько мне известно, уникальны для Лиспа. Частично потому, что чтобы сделать такие макросы, возможно требуется сделать ваш язык выглядящим так же странно как Лисп. Очень может быть, что когда вы добавите в язык последнее приращение мощности, вы больше не сможете заявить. что изобрели новый язык, это будет лишь новый диалект Лиспа.

Я заметил это по большей части шутя, но это довольно верно. Если вы определите язык, который имеет функции car, cdr, cons, quote, cond, atom, eq, и нотоацию для представления функций как списков, то можете построить остальной Лисп из этих частей. Это в действительности определяющее качество Лиспа, и было сделано так специально, поэтому Маккарти и дал Лиспу такое представление, которое он имеет сейчас.
На самом Лиспе работать не доводилось, но пришлось столкнуться с языком Caml. Это функциональный язык, и, как я вижу, имеет родственные связи с Лиспом. Я учился и работаю во Франции, и тут этот язык очень активно и повсеместно используется в системе образования, преподаётся со 2-го курса. Причем, кое-где - даже первым языком! (программные языки типа Java или С++ преподают позже). Многие научные разработки тоже делают на этом языке, пользуясь как раз математической строгостью (распознование типов и тд.) и возможностью рассматривать функции как данные. В частности, только в моей лабе Caml используется как минимум в 3-х проектах: изучение (и создание) протоколов для инф. безопасности, разработка систем автоматической проверки программ на соответствие спецификациям, и, наконец, создание целой расширенной библиотеки на Caml для параллельных кластерных приложений из области вирт. реальности (протокол Functional bulk-synchronous parallel). Это только то, о чем я точно сам слышал и в курсе. И только в нашей лабе. Вообщем, этот язык тут весьма широко используется для преподавания и в науке (т.е. в информатике). Я лично работал на этом языке пока учился, написал на нем систему распознования образов в рамках курсовой. В данный момент никак с ним не работаю (занимаюсь программированием в ограничениях и machine learning, на стыке между этими 2-я областями)
А вот ссылка на страничку об этом языке: http://caml.inria.fr
Вот что я мог рассказать про Caml, дальнего родственника Lisp. :улыб:
Француз
В каком то смысле все языки, которые переняли какие-то из 9 идей, представленных изначально в Лиспе, являются его родственниками.

Конечно в ML содержится и много своих оригинальных идей.
Я много читал и слышал о семействе ML языков (кстати название раскрывается то как Meta Language). Немножко изучал OCaml вдохновленный примером функциональных языков со статической типизацией вроде Haskell и Clean. То есть я хотел использовать OCaml как энергичный вариант Haskell. Статическая типизация по Хиндли-Миллнеру очень хорошая вещь для создания надежных приложений, так как позволяет отлавливать большую часть ошибок во время компиляции. Но, к сожалению, под винды нет хороших библиотек GUI и IDE для наилучшего применения OCaml в реальных проектах. OCaml - несомненно очень практический язык: позволяет отклоняться от функционального стиля когда надо, имеет быструю систему отлова исключительных ситуаций, сверх быстрый сборщик мусора, синтаксический сахар для сопоставления образцов и определения типов и т.п.

По моему опыту недостатком является определенная сложность запоминания синтаксиса языка и отсутствие хороших библиотек.

Что касается Common Lisp, то выходцу с C/C++/Pascal/Java изучать его значительно легче, так как Лисп не претендует на звание функционального языка (хотя OCaml тоже не причислишь к чисто функциональным). Программы на С/Pascal/Java можно практически один к одному переписывать на Лисп. Мой опыт С++ программирования позволил сразу делать на этом языке полезные вещи без особенного обучения. То есть IMHO в этом плане Common Lisp более практический язык, чем ML языки. Взять например лисповский LOOP, который позволяет писать циклические алгоритмы практически на английском языке, потому что LOOP специально создавался для обучения. Вы можете сами создавать подобные вещи в Common Lisp, для своего же удобства привыкания к языку.

Тем не менее планирую продолжать изучение Ocaml, так как это как минимум дает интересные идеи для применения в других языках.

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