LISP все еще полезен в современном мире? Какая версия чаще всего используется?


117

Я стараюсь учить себя новому языку программирования через равные промежутки времени. Недавно я прочитал, что Lisp и его диалекты находятся на совершенно противоположном конце спектра от языков, подобных C / C ++, что сделало меня достаточно любопытным, чтобы узнать больше об этом. Однако мне неясны две вещи, и я ищу рекомендации по ним:

  1. LISP все еще практикуется / используется в современном мире, или это унаследованный язык, такой как FORTRAN / COBOL? Я имею в виду, помимо поддержки существующего кода, он вообще используется в новых проектах?

  2. Какой диалект наиболее широко используется? Я встретил Scheme и Common Lisp как два самых распространенных диалекта и хотел узнать ваше мнение о том, какой из них наиболее предпочтительный / полезный для изучения - и был бы очень рад, если бы вы могли предложить любые ресурсы для начинающего ранга.

Желая выучить язык, который принципиально отличается от процедурных языков, к которым я привык, я не хочу вкладывать чрезмерные усилия во что-то, если оно полностью устарело - я бы все равно выучил его, если бы он был профессионально «мертвым», но только с академической точки зрения ...


10
Я очень заинтересован в этом вопросе. Время от времени, когда у меня есть время, я решаю попытаться изучить Lisp. И каждый раз, когда меня смущают одни и те же вопросы и неопределенности, о которых ты здесь спрашиваешь. Какую версию Lisp я должен изучить? Кто-нибудь (кроме Пола Грэма) действительно использует Лисп? Должен ли я изучать Lisp или один из новых функциональных языков программирования, таких как Haskell? Каковы преимущества Lisp над Схемой и т. Д. И т. Д.
Channel72


Практический общий Лисп: gigamonkeys.com/book
Joe Internet

"Все еще"? (Я шучу!)
шутит

Я только что нашел этот другой связанный поток на SO: stackoverflow.com/q/1614724/212942
TCSGrad

Ответы:


59

Мне скорее нравится Scheme, если вы хотите работать с JVM, вы должны проверить Clojure, который является списком, предназначенным для работы в JVM. И да, Лисп все еще стоит научиться видеть, насколько мощным может быть такой минимальный дизайн! Люди, которые создали LISP, правильно поняли некоторые вещи. Удивительно, как много классных новых возможностей современных языков появилось в 1960-х годах!

Для встроенной схемы попробуйте guile: http://www.gnu.org/s/guile/


Есть ли диалект, который хорошо работает с C / C ++, потому что я в первую очередь парень C ++? Не могли бы вы также упомянуть некоторые ресурсы для начинающего, чтобы начать изучать этот диалект?
TCSGrad

10
Лучшими книгами для изучения схемы являются «Маленький интриган» и « SICP » mitpress.mit.edu/sicp . Существует ряд реализаций схем, которые можно встроить в c / c ++, но я не знаю, какие из них хороши в наши дни, поэтому вам, возможно, придется поискать в Google.
Захари К

1
Я должен отметить, что схема очень проста! Вы выучите около 90% языка за 2 часа. Конечно, это не значит, что вы освоите его, просто вы будете знать, как работает синтаксис.
Захари К

5
@ shan23 Схема была разработана для обучения. Без сомнения, его можно использовать для обучения новичка программированию, поэтому я не сомневаюсь, что у вас не возникнет проблем с его изучением. Если вы хотите интеграцию с C или C ++, посмотрите Guile ( en.wikipedia.org/wiki/GNU_Guile ).
Витор Py

1
Книга Кента Дибвига по языку программирования Scheme, возможно, не так известна, но очень хорошая. схема.com/tspl4 Если вы используете Emacs, то изучение некоторого Lisp удобно.
blispr

68

В ответ на вопрос 2 «Наиболее широко используемый диалект»:

Зависит от того, как вы интерпретируете «Наиболее широко используемый». Вот некоторая салфетка математика для нижних оценок на сколько использования каждые из нескольких выбранных диалектов получить.

Написан самый сырой код

  • Возможно Схема (все диалекты) из-за образовательных приложений
    • 270 школ ... Допустим, 50 учеников / год, 500 строк кода / ученик, 10 лет подряд. 1 000 000 строк на основе математики для салфеток.
    • 50000 линий Racket в самой Racket и ее инструментах.
  • Возможно Common Lisp из-за ИИ и большого количества открытого исходного кода и производственного кода (см. Производственный код).
  • Возможно, Emacs Lisp из-за ...
    • Сам Emacs: более 1 000 000 строк
    • Общее количество написанного на emacs lisp - 237 модулей, около 200 строк / модулей - это 40000 строк только на EmacsWiki, вероятно, намного больше в ELPA
    • Плюс приложения, написанные на emacs Lisp, .emacs файлах и т. Д.
  • Clojure
    • Трудно оценить. В основном небольшие доткомы. Может быть много.

Победитель: Схема или Общий Лисп. Слишком много неизвестных.

Самый производственный код

Победитель: Я предполагаю, что Common Lisp . Я думаю, что мы можем ответить «Да» на вопрос 1, основываясь на использовании Common Lisp и Clojure.

Большинство конечных пользователей

  • Обыкновенный Лисп
    • Клиенты ITA Software, включая Orbitz, Bing Travel и Kayak.com - вероятно, миллионы.
  • Clojure
    • Citigroup (без подробностей), Akamai (без подробностей), simple.com, многие другие. Вероятно, миллионы.
  • Схема
    • Студенты CS, исследователи и любители. Меньше, чем базилион.
    • Серия Uncharted - более 5 миллионов
  • Emacs Lisp - В основном программисты, в основном на платформах Unix. Может быть миллион.

Победитель: Схема имеет лучший нижнюю границу здесь, так как есть цифры продаж на Uncharted, но это весьма спорно.

Заключение

В заключение я нахожу, что большие яблоки.


4
Не маленькие апельсины? Или пурпурный лимон?
Vatine

Действительно схема - особенно ракетная схема - кажется, самый современный диалект лиспа. Инструменты профессионального уровня и библиотеки.
Бикал Лем

@Bikal Я бы хотел, чтобы поддержка OpenGL была не такой устаревшей, но прямой режим не самая большая ошибка в моем коде Racket ...
Джесси Милликен,

Не знал, что Orbitz использовал CL ... Я знаю, где искать мою следующую работу: D
Rig

2
В Racket было написано более 100 тыс. LOC. Стандартная библиотека / IDE / инструменты Racket имеют размер более 500 тыс., Плюс она используется в таких компаниях, как SET, Boeing и Naughty Dog.
Сэм Тобин-Хохштадт

43

LISP все еще практикуется / используется в современном мире, или это унаследованный язык

Да, это так, но вы должны знать, где искать. Люди, которые используют LISP, обычно не кричат ​​об этом слишком громко, но есть несколько примеров того, как несколько высококлассных стартапов использовали его с большим эффектом за последние 20 лет. Он также очень популярен среди небольших компаний в Европе.

Какой диалект наиболее широко используется?

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

LISP - это семейство языков, и каждый из этих языков имеет семейство диалектов и реализаций. В широком смысле диалекты делятся на два лагеря «LISPs» и «Schemes».

LISP: до недавнего времени Common LISP был королем. Это была попытка объединить все разрозненные LISP и, не будучи недобрым, была "C ++" LISP. То есть это был ОГРОМНЫЙ язык. Там было все. За последние несколько лет появился Clojure. Clojure - это LISP, который работает на виртуальной машине Java и пытается внедрить себя в философию функционального программирования. Традиционно, другие LISP были строго мультипарадигмы. Clojure интересен тем, что получает как самые лучшие, так и самые худшие результаты как для LISP, так и для JVM. Все еще много подробностей языков на основе Java, и они были довольно бесплатны и просты с синтаксисом, так что у него есть множество кнопок и кнопок для разных вещей, но у них есть некоторые действительноинтересные идеи вокруг типов данных, особенно некоторые из практических способов, которые они придумали для применения идей из функционального программирования.

Схемы: Схемы являются строгим подмножеством LISP. Схема была изобретена Стилом и Суссманом и в молодости отличалась тем, что использовалась в курсе лекций MIT Computing 101. Схема определена в «Пересмотренном отчете по алгоритмической языковой схеме (RnRS)». Да, у них там есть математическая шутка. Схема является стандартизированным языком в отличие от других LISP. Это очень помогает в переносимости между реализациями, но это не серебряная пуля. Усилия по стандартизации имели тенденцию быть консервативными, а инновации в реализациях, особенно в таких вещах, как модули, имели тенденцию быть разрозненными. Существует также ряд SRFI (запросов схемы для реализации), которые аналогичны процессу RFC IETF. Люди используют его, чтобы стандартизировать мелочи по мере необходимости.

Схемы отличаются от LISP тем, что у них есть набор жестких требований, которым они должны удовлетворять, одним из которых является «оптимизация хвостового вызова», которая помогает сделать рекурсию эффективной. Следовательно, рекурсивные стили программирования гораздо более популярны в Scheme, чем в LISP. Схема, также, не будучи недоброй, как "C" LISP. То есть это небольшие языки, и вы должны иметь возможность хранить все это в своей голове сразу.

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

Теперь я буду более конкретным:

PicoLisp - это действительно классный LISP. Это крошечный! Автор написал это для себя, и, насколько я понимаю, он зарабатывает на жизнь этим с 1980-х годов. Если вам когда-нибудь удастся посетить его выступление, вам следует сделать это: он действительно интересен и действительно знает свое дело, и вы не услышите ни малейшего нюха мейнстрима или скучного.

Я не знаком с реализациями Common Lisp, поэтому я не буду комментировать их дальше.

Guile - это официальная схема GNU.

Racket - это схема R6RS, но в последнее время она, похоже, расширила сеть и пытается «служить платформой для создания, проектирования и реализации языка».

Цыпленок стремится быть практической схемой. Он основан на R5RS и компилируется до C. Это оказывается действительно очень важным преимуществом, поскольку делает использование тривиальных библиотек C абсолютно тривиальным. Поэтому Chicken, вероятно, является наиболее полезной схемой для замены Perl, Python, Ruby и т. Д. В качестве повседневного языка сценариев. Есть несколько человек, которые использовали его исключительно для всех своих нужд в течение нескольких лет. Он имеет интерактивный REPL, а также компилятор. Сообщество (как в списке рассылки, так и в IRC) хорошо осведомлено, дружелюбно и полезно.

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

Ищите реализацию с компилятором или, по крайней мере, что-то, не основанное исключительно на IDE или REPL. Многие реализации, предназначенные для обучения, очень сложно использовать для сценариев общего назначения.

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

Я не хочу вкладывать неуместные усилия во что-то, если оно полностью устарело - я бы все равно научился этому, если бы оно было профессионально «мертвым», но только с академической точки зрения ...

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


3
Ракетка не является схемой R6RS; среди языков, предлагаемых дистрибутивом Racket, есть один. Фактический язык Ракетки - это Схема, которая отличается от RnRS несколькими важными способами (по поводу которых у меня смешанные чувства).
JasonFruit

27

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

Я нашел, что это был очень поучительный опыт изучения Lisp в форме Clojure за последний год (после большого опыта работы с Java и C #). Основными причинами этого являются:

  • Он имеет достаточно сильный акцент на функциональное программирование (больше, чем в большинстве других Лиспов). Автор и BDFL Rich Hickey часто цитируют Haskell как один из источников вдохновения для языкового дизайна, который означает, что вы получаете такие вещи, как полностью неизменные структуры данных, ленивые бесконечные последовательности и т. Д.
  • Макропрограммирование макросов - философию Lisp «код - данные» трудно понять, если вы на самом деле не испытали ее, но это одна из причин, по которой Lisps настолько выразителен и продуктивен
  • Фантастическая поддержка многоядерного параллелизма - я думаю, что Clojure - лучший язык для параллельного программирования прямо сейчас. См. Http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey для ознакомительной презентации об этом

Это также представляется практическим выбором для реального использования по следующим причинам:

  • Работа на JVM с очень простым взаимодействием Java дает вам доступ ко всем библиотекам и инструментам в экосистеме Java
  • По умолчанию это динамический язык , что делает его очень удобным для разработки и быстрого создания прототипов практически без всяких шаблонов. Однако вы можете добавить статические подсказки типа, чтобы получить довольно хорошую производительность там, где вам это нужно.

Я лично знаю людей, использующих Clojure в паре инвестиционных банков и стартапов. Я также выбрал Clojure в качестве основного языка разработки для своего собственного стартапа, так что я готов положить свои деньги туда, где я говорю :-)


9

В настоящее время я также изучаю Lisp (и мне это нравится). Я использую Common Lisp, но я также возился с SBCL , Arc (обратите внимание, что это версия Lisp Пола Грэма, которая, как упомянул Витор Брага, создал магазин Yahoo / Viaweb) и Allegro CL, которая похожа на Visual Studio для Lisp (может создавать графические интерфейсы, однако, я никогда не использовал его).

Что касается использования, Lisp часто использовался в искусственном интеллекте, но я буду честен, я не уверен, сколько других «общих» применений для Lisp. Многие веб-сайты, которые были созданы в Лиспе, изначально были переписаны на других языках, поэтому трудно сказать, что он используется в веб-разработке (не говоря уже о том, что это не так, но более крупные сайты, которые его используют, больше не делают ). После быстрого поиска (очень быстрого) вот список программного обеспечения, написанного на Common Lisp из Википедии .

[РЕДАКТИРОВАТЬ] Что касается профессионального использования Lisp, есть рабочие места, которые позволят вам использовать Lisp. Их не так много, как, скажем, Java или C #, но они существуют. Я думаю, что Lisp - один из тех языков, который используется для внутренних приложений и может дать конкурентное преимущество, от которого компании не хотят отказываться, рекламируя, что они используют Lisp. Я помню, как увидел пост на P.SE, в котором говорилось, что Smalltalk похож на финансовую арену.

Кроме того, возможность показать, что вы способны изучать различные парадигмы, может открыть больше дверей, даже если вы не используете Лисп в своей работе.

«Lisp стоит изучать за глубокий опыт просветления, который вы получите, когда, наконец, получите его; этот опыт сделает вас лучшим программистом до конца ваших дней, даже если вы на самом деле никогда не будете часто использовать сам Lisp». - Эрик Рэймонд, «Как стать хакером»

[/РЕДАКТИРОВАТЬ]


7
FWIW, SBCL - это реализация Common Lisp, как и Allegro CL.
Ватин

@Vatine - вы были бы правы. Если бы было покрасневшее лицо, я бы сделал это сейчас. Я не знаю, почему я предположил, что они разные. Тупой мне другой компилятор! = Другой диалект :) спасибо!
Джетти

@Jeff: Ну, они оба расширяют язык в разных направлениях, оставляя «ядро CL» совместимым.
Ватин

@Jetti Что вы использовали в первую очередь?
Марк С

Я полагаю, что использовал CLISP, он был на образе виртуальной машины, которого у меня больше нет. Я думаю, что мое невежество заставило меня поверить, что это был общий шут. По крайней мере, теперь я знаю лучше.
Джетти

8

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

Даже если вы не научитесь использовать его на самом деле, изучение его всегда полезно: вы изучаете новые способы думать и решать проблемы, даже на других языках, как только вы на некоторое время сосредоточились на Лиспе.


3
Проблема со Схемой в том, что когда вы начинаете с ней практиковаться, вы не хотите возвращаться к другим языкам. Я только начал реализовывать потоки (возможно, бесконечные, лениво вычисляемые, неизменяемые последовательности) в C ++, и это намного больше кода, чем в Scheme! Я был очень удивлен сочетанием простоты и мощи Схемы.
Джорджио

++ для ракетки. Это действительно невероятно ПОЛНО, что является одной из критических оценок других схем. И это выходит за рамки того, что может сделать схема в отношении создания ваших собственных языков.
Скотт Кларенбах

7

Значительная часть бэкэнда Amazon раньше была на Лиспе, но теперь была переписана на C ++, или я так слышал (должен признать, у меня нет надежного источника для этого).

Yahoo! Stores - один из классических примеров веб-приложений Lisp. От Yahoo! Магазины славы вы, возможно, слышали о Пол Грэм . Грэм является одним из самых известных сторонников Лиспа и подробно пишет на эту тему. Вы могли бы хотеть прочитать его сайт, чтобы знать его пункты.

AutoCAD имел обыкновение иметь диалект Lisp для своей макросистемы. Я не знаю, так ли это до сих пор.

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


Что бы вы посоветовали в качестве начальной книги / компилятора для Scheme? Я использую Linux, так что если есть какой-либо редактор, который явно полезен для новичков (например, Kile для LaTex), дайте мне знать ...
TCSGrad

1
@ shan23 Маленький интриган ( ccs.neu.edu/home/matthias/BTLS ) - ваш лучший выбор . Я считаю, что emacs - самый распространенный редактор для Scheme, но чтобы привыкнуть к нему, нужно время.
Vitor Py

1
Редактор для lisp, это легко, используйте emacs. Это было написано ребятами из LISP и в LISP.
Захари К

Вы также можете использовать Racket IDE ( racket-lang.org ); он похож на Emacs, но имеет автоматическое форматирование и взаимодействие с интерпретатором Scheme.
Иеремия Уиллкок

Lispbox ( common-lisp.net/project/lispbox ) работает "из коробки" (полезен опыт работы с emacs). Он основан на ccl ( ccl.clozure.com ), см. Также gigamonkeys.com/book/…
Джорджио

4

LISP все еще практикуется / используется в современном мире, или это унаследованный язык, такой как FORTRAN / COBOL? Я имею в виду, помимо поддержки существующего кода, он вообще используется в новых проектах?

Я знаю нескольких парней, которые делают Lisps в некоторых стартапах в Силиконовой долине, и я знаю, что Amazon.com использует Lisp с самого начала (хотя я слышал, что они почему-то заменяют его на C ++?)

Но одной компанией, за которой нужно следить, является Naughty Dog . Все их игры написаны на диалекте Лисп. Первоначально они катились самостоятельно, но они используют MZScheme в серии Uncharted.

Какой диалект наиболее широко используется? Я встретил Scheme и Common Lisp как два самых распространенных диалекта и хотел узнать ваше мнение о том, какой из них наиболее предпочтительный / полезный для изучения - и был бы очень рад, если бы вы могли предложить любые ресурсы для начинающего ранга.

Держу пари, что Common Lisp, Clojure, Scheme и Emacs Lisp являются четырьмя наиболее широко используемыми диалектами, и я подозреваю, что Scheme является наиболее распространенным. У меня нет ничего, чтобы подтвердить это, конечно. :)

Я предпочитаю SICP и Little Schemer, как предлагали другие, но я бы также предложил Land of Lisp , что довольно интересное чтение. :)


Действительно, Land of Lisp - удивительное чтиво.
Хирон

@ 4bu3li Ты не голосовал?
Марк С

1
О Naughty Dog: Это не совсем правильно, их игры для PS2 были написаны на языке GOAL, похожем на шутки ... Но после перехода на PS3 они перешли на использование C ++. MZScheme используется главным образом в качестве препроцессора макросов, написанного in-line с C ++, и используется для некоторой обработки ресурсов, а некоторые из их сценариев написаны на S-exps. Но никакой код MZScheme на самом деле не работает на PS3.
Арелиус

2

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

Лично я пытаюсь использовать SBCL или, в последнее время, Clojure (и некоторые Emacs Lisp, но htat потому, что я длительный пользователь Emacs - я бы попытался изучить Emacs Lisp, когда я пытаюсь изучить Lisp). Теперь все, что мне нужно сделать, - это найти время, чтобы поиграть с этими языками ...


1
В основном это первый ... так как довольно очевидно, что если я преуспею в этом, это, безусловно, не повредит моему резюме вообще :). А если серьезно, я хочу взглянуть на различные «стили» программирования, так что у меня есть хорошая идея, какой из них использовать в различных сценариях (не хочу попадать в ситуацию, когда вооружен только молотком, Я должен относиться ко всем проблемам как к ногтям !!)
TCSGrad

2

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

Также в Нью-Йорке огромная группа встреч. Я предполагаю, что если вам интересно и вы пойдете в свою группу встречи clojure, вы можете найти возможности пообщаться и найти работу (не рабочие места clojure, а такие вещи, как Java / C ++ / etc.). В нью-йоркском районе это кажется огромным, другие районы могут отличаться.

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

Классический пример - как реализовать MAX (a, b, c). Вы можете сделать замысловатую функцию с кучей операторов if. Или вы могли бы просто сказать

МАКС (МАКС (а, б), в)

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


3
На самом деле вы можете упростить MAX путемMAX(MAX(a b) c)
Андреа

Вы правы, это то, что я получаю, отвечая вскоре после пробуждения. Я поправил ответ.
Cervo

2
Проект НАСА был Deep Space 1: flownet.com/gat/jpl-lisp.html
Фрэнк Шиарар,

2

Два дополнительных пункта:

Во-первых, Lisp - отличный язык для написания кода, в котором взаимодействия между функциями или данными часто бывают сложными. Во многих популярных языках, если вы не понимаете, почему ваша программа делает то, что делает, вы должны написать специальные функции, которые позволят вам исследовать внутреннее состояние программы по мере ее продвижения. На некоторых языках вам придется ждать, пока ваш код перекомпилируется. Конечно, могут быть такие инструменты, как отладчики, которые помогают с этим. Однако в Лиспе все, что вам нужно, это способ остановить программу, и тогда, как правило, у вас есть доступ ко всему в Лиспе. В Common Lisp иногда я просто набираю ^ C или вызываюerrorв одну функцию (это единственная вещь, которая должна быть перекомпилирована, и вам не нужно ничего делать, чтобы перекомпилировать ее). Как только я остановил программу, меня сразу же бросили в отладчик - но отладчик дает мне все возможности Lisp, и я могу выйти из отладчика, вызвать определенные функции и т. Д. Я легко могу исследовать любую из структур данных в моей программе. Большинство схем должны разрешать подобные практики. Lisp не уникален в этом отношении, но то, что он предлагает, выходит за рамки того, что предлагают многие популярные языки.

Второе: если вы собираетесь экспериментировать с любым диалектом Лиспа, я бы не сделал этого без (а) использования редактора, соответствующего скобкам, и (б) изучения правильного отступа в Лиспе. Было бы неплохо использовать редактор, который также приблизит вас к правильному отступу. Форматирование кода в стиле C / C ++ / Java разработано для языков с меньшим количеством скобок / скобок / скобок, чем в Lisp. Прекрасный стиль печати Lisp работает хорошо, как только вы его освоите, и вы не запутаетесь в скобках и не тратите половину своего пространства, помещая по одной закрывающей скобке на строку.


1

Прямо сейчас у меня складывается впечатление, что Lisp в основном используется в консалтинговых магазинах (не то, что консалтинговые магазины используют его в основном).

Это считается немного неприличным для практического программного обеспечения. В основном потому, что люди к этому не привыкли.

Традиционно Scheme является довольно академическим диалектом Lisp, а Common Lisp был отраслевым диалектом.

Lisp особенно полезен для символических манипуляций и возможностей отражения.

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


Интересный момент, который вы указали в отношении различий между Scheme и Common Lisp - не могли бы вы пояснить, почему / как это?
TCSGrad


1

Я хотел бы добавить некоторые соображения о Common Lisp и Scheme. Я избежал замыкания из-за JVM, поэтому у меня нет особой перспективы.

Схема - это красивый лаконичный, четко определенный язык. Он принял много решений, которые CL должен был принять из-за унаследованного, и использовал более чистый подход. Например, переменные и функции находятся в одном пространстве имен. Язык по умолчанию меньше и более лаконичен, что хорошо подходит для обучения тем вещам, в которых хорошо работает lisp, например, он требует использования рекурсии вместо итерации, поскольку по умолчанию он не имеет итерационных циклов и требует оптимизации хвостовых вызовов , Схема имеет очень интересную гигиеническую макросистему, которая имеет большое значение для обучения. Но IMO, я бы рекомендовал сначала изучить негигиенические макросы в стиле CL, из которых большинство (?) Диалектов схемы предлагают хотя бы одну реализацию, даже если это не является частью спецификации. Поскольку кажется, что вы хотите выучить язык ради обучения, я

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

Common Lisp, с другой стороны, кажется гораздо более прагматичным подходом к разработке языка. Стандарт таков, что многие lisp-коды переносимы между реализациями, многие компиляторы работают быстро и хорошо оптимизированы. Существует большой набор пакетов, многие из которых переносимы между реализациями. И, похоже, на языке создается (сравнительно) большое количество реальных продуктов. И, скажем, quicklisp, это управление пакетами чувствует себя довольно близко к тому, что вы получили бы в современном сообществе, как, например, Ruby или Node. CL, однако, не лишен недостатков, на данный момент имеет очень большую спецификацию по сравнению со схемой, и даже объектная система CLOS, которая традиционно пишется как библиотека на Лиспсе, является частью спецификации IIRC. И вы можете чувствовать наследие, укоренившееся в большом количестве системы.

В противном случае я сказал, что не могу говорить о clojure, и Emacs Lisp, безусловно, является подходящим выбором, если ваша цель состоит в написании расширений Emacs, и, очевидно, не является подходящим выбором для другого программного обеспечения.

TLDR; Если ваша цель - учиться, я рекомендую Схему. Однако, если вы хотите создавать программное обеспечение, я бы порекомендовал Common Lisp из двух основных вариантов lisp.


Кстати, PLT Racket - это язык, который больше похож на схему, и первоначально из сообщества разработчиков схем, которые, кажется, пытаются быть полезными для реальной работы. Если бы в эти дни я должен был написать код в схеме, это, скорее всего, либо PLT, либо Chicken Scheme, но позднее это может произойти из-за слабости в моем сердце.
Арелиус

0

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

Я должен упомянуть newLISP . Хотя он немного отличается от CL и Scheme, он реализует много очень полезных функций. Я считаю, что http-сервер, функции многопроцессорной обработки (Cilk) и функции удаленной оценки очень чисты и просты в использовании.

Единственный исполняемый файл небольшой, быстрый и включает в себя множество классных батарей.


Вероятно, было бы справедливо упомянуть об этом, но я бы точно не рекомендовал это ... Никаких лексических ограничений и модулей, например - серьезно? Я действительно не понимаю, чего пытается добиться newLISP.
2013 года

2
Ты прав - это другое. Он использует контексты и динамическую область видимости, и из моего опыта модули и контексты взаимосвязаны. Он не пытается быть ни другим CL, ни Схемой. Чтение страницы о ее различиях ( newlisp.org/index.cgi?page=Differences_to_Other_LISPs ) проливает свет на проблемы дизайна. Кроме того, я бы не рекомендовал это никому, кто хочет получить опыт CL или Scheme. Но для некоторых случаев использования это может быть жизнеспособным выбором. В этом прелесть экосистемы с открытым исходным кодом - большой выбор!
CyberFonic

0

Другим фактором, который следует учитывать при выборе диалекта языка Лисп, может быть количество и качество реализаций. Если у диалекта есть только одна или две реализации, то вы застряли с их недостатками, пока эти недостатки не будут исправлены, и всегда есть шанс, что люди перестанут совершенствовать реализацию. Само по себе это не причина не использовать диалект Lisp с одной реализацией, но это то, что нужно учитывать. Преимущество Scheme и Common Lisp в том, что существует множество реализаций этих диалектов. Оба языка имеют опубликованные стандарты, поэтому относительно недавние реализации, скорее всего, будут выполнять один и тот же код. Некоторые из этих реализаций существуют уже давно, но все еще находятся в стадии активной разработки: сейчас они являются высококачественными реализациями, и они все еще находятся в стадии совершенствования.


В соответствии с
этими тестами

Спасибо Андреас. Вы правы. Показывает, сколько я знаю о JVM - немного. Частично я был введен в заблуждение ABCL, относительно медленным, но в остальном хорошим CL на основе JVM.
Марс

Я бы поспорил, если ты хочешь Лисп на JVM, иди к Clojure. Это не идеально, но это настоящее удовольствие (ИМХО)
AndreasScheinert
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.