Какой диалект Лиспа мне следует изучить? [закрыто]

89

Я знаю, что есть несколько разных диалектов Лиспа. Решив, что изучение Лиспа станет новым интеллектуальным опытом, я хотел бы знать, какой диалект Лиспа изучать и почему.

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

Хамфри Богарт
источник
1
Дубликат: stackoverflow.com/questions/563356/which-lisp-should-i-learn
Грег Хьюгилл
Я провел поиск по этому поводу, прежде чем задать это, но характер вопроса изменился, когда я его печатал. Я позабочусь о том, чтобы не изобретать велосипед.
Хамфри Богарт,
Так в чем разница между этим вопросом и тем, о котором упоминал Грег выше?
cjs
2
Я думаю, он пытался сказать следующее: когда я впервые сформулировал свой вопрос в уме, он полностью отличался от текущего, и просмотр вопросов в соответствующем поиске не выявил ничего, что соответствовало бы тому, что он хотел просить. Но к тому времени, когда он напечатал вопрос, он изменился и, таким образом, прибыл на SO в его нынешней форме, которая задавалась ранее.
J. Polfer

Ответы:

77

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

  1. Схема. Наверное, самый чистый из всех диалектов. Несомненно, именно поэтому The Little Schemer был переведен с LISP на Scheme. Пятая стандартная спецификация схемы, R5RS , сама по себе является прекрасным образованием; это может быть самая хорошая спецификация языка и библиотеки, которую я когда-либо читал, а также самая короткая и достаточно всеобъемлющая. Платформа PLT Scheme (теперь Racket) включает в себя довольно приличный интерпретатор и компилятор, хороша для написания сценариев, а также имеет некоторые визуальные инструменты, которые делают ее отличной для обучения.

  2. Common Lisp. Вероятно, наиболее переносимый и всеобъемлющий вариант, это, скорее всего, то, что вам нужно, если вы хотите писать такие вещи, как коммерческое программное обеспечение. Стандарт определяет обширные библиотеки, и многие другие доступны помимо этого, в нем есть CLOS , который, вероятно, научит вас больше об объектно-ориентированном программировании, чем любой объектно-ориентированный язык, а некоторые из компиляторов очень хороши. К недостаткам можно отнести некоторые недостатки, которых у Scheme нет (например, наличие отдельного пространства имен для переменных, которые относятся к функциям), не столь ясный и простой (как в случае со всем, что должно было иметь расширения и делать необходимые компромиссы. для больших приложений в реальном мире), не имея гигиенических макросов и уделяя рекурсии гораздо меньше внимания, чем Scheme.

  3. Clojure.Он работает на JVM, что может дать ему преимущество для разработчиков Java. У него есть несколько недостатков (например, вы должны явно запросить оптимизацию хвостового вызова, хотя однажды это может измениться, если TCO будет добавлена ​​к JVM). Макросы, хотя и не являются гигиеничными, все же имеют некоторые функции, которые помогут вам избежать захвата переменных, поэтому вы можете захватывать переменные, если действительно хотите, при этом с меньшим риском случайности, чем в CL. У вас есть легкий доступ ко всем библиотекам Java; это, вероятно, хорошо для кода «реального мира» и довольно бессмысленно с точки зрения обучения. В нем есть набор библиотек для постоянных структур данных и поддержка STM, что делает его очень интересным с точки зрения параллелизма; это, вероятно, ваш лучший выбор, если вы Вам интересно узнать больше о новых методах работы с параллельным и параллельным программированием. Похоже, что Clojure можно использовать для больших производственных приложений так же, как и Java, в том смысле, что он будет иметь возможность делать «уродливые вещи», которые вы делаете в производственных приложениях, которые вы бы предпочли не делать и не делать. когда ты учишься.

  4. Emacs Lisp. С точки зрения LISP, это не один из лучших примеров. Один из самых больших недостатков - динамическое определение объема, но есть и много других. Однако, если вы пользователь Emacs, это может быть самый мощный инструмент, который вы можете изучить, чтобы улучшить использование редактора. Однако насколько многому вы действительно научитесь, изучая Emacs Lisp, помимо того, как расширять Emacs, для меня вопрос открытый; Я не знаю, как часто в Emacs Lisp действительно используются интересные методы, такие как функции высокого порядка.

Обновление 2018

Прошло почти десять лет с тех пор, как я написал этот пост, и теперь семейство языков Lisp, похоже, приобретает значительную популярность в сознании программистов. Многое из этого, похоже, связано с Clojure, который не только стал отдельным диалектом Lisp сам по себе, представляя многие из своих собственных хороших идей, но также теперь имеет почти идентичную версию, нацеленную на JavaScript, и вдохновил многие другие Lisp. таргетинг на другие платформы. Например, Hy нацелен на CPython AST и байт-код, в первую очередь стремясь к взаимодействию с Python, но используя идеи Clojure «в случае сомнения». (Хотя из последних коммитов, последние могут немного измениться.)

Большое изменение, которое это вносит в ваш процесс принятия решений, заключается в том, что вы также должны смотреть на все доступные Lisps или подобные Lisp языки и взаимодействовать с языками или платформами, которые вы уже используете, будь то Perl , Ruby , Erlang , Go или даже C ++ на микроконтроллерах .

cjs
источник
3
Наличие отдельных пространств имен - это не бородавка, это просто другое дизайнерское решение. Имейте в виду, что в Scheme уже есть несколько других пространств имен, поэтому споры скорее ведутся против Lisp-5 против Lisp-6. Помимо удобства, которое я могу назвать в CL списком, а машину - автомобилем, его макросистема намного более практична и полезна, потому что компилятор не так легко запутывает вещи.
Svante
Clojure не имеет оптимизации хвостовых вызовов, и не может, потому что байт-код JVM не поддерживает ее. Все, что у него есть, - это специальная форма "повторения", которая саморекурсирует текущую функцию.
Svante
3
Курт: Я бы сказал, что Clojure является наиболее переносимым, поскольку он работает на виртуальной машине Java.
justinhj
1
Я не знаю об этом; Если вы исключите небольшие и встроенные устройства (например, телефоны и смарт-карты), где вы в любом случае не собираетесь запускать неизмененную программу рабочего стола / сервера, elisp определенно работает на гораздо большем количестве процессоров и платформ, чем JVM.
cjs
1
Я категорически не согласен. Рекурсия имеет тенденцию создавать код, который а) более чистый, б) легче верифицируется, в) с большей вероятностью будет правильным. Более подробно: а) он меньше затрагивает меньшее количество переменных вне функции; б) индуктивное доказательство имеет тенденцию естественным образом выпадать из рекурсивной функции, тогда как с циклами вам нужно проверять инварианты циклов и т.д .; в) надежность проистекает из а) и что вас склонны к кодированию таким образом, который естественным образом заставляет вас (возможно, неформально) провести индуктивное доказательство б).
cjs 04
22

Я бы сказал Scheme исключительно из-за Little Schemer , одной из самых умопомрачительно забавных, но чрезвычайно сложных книг, которые я когда-либо пробовал читать.

Дж. Польфер
источник
15
Не забывайте SICP! mitpress.mit.edu/sicp . Это классическое чтение.
Joris Timmermans
7
До того, как The Little Schemer вышел в качестве их перевода, было два или три издания Little Lisper .
cjs
9

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

Лесли П. Ползер
источник
8

Кроме того, Clojure в наши дни набирает популярность, и не зря. Отличные структуры данных, очень хорошая поддержка параллелизма (позор в этом плане Scheme и CL) и отличное сообщество. Это также относительно просто, CL не менее сложен, чем C ++.

Это не значит, что мне не нравится CL или Scheme. Я изучил схему с помощью SICP. И CL привел меня на Clojure. Полагаю, все зависит от ваших целей. Если вы хотите изучить очень практичный Лисп, выбирайте Clojure. В остальном CL или Scheme хороши.

dnolen
источник
Похоже, это означает, что ни CL, ни Scheme не являются «чрезвычайно практичными», хотя на самом деле они вполне практичны. В особенности стандарт CL был рожден из практических соображений.
Лесли П. Ползер
2
С 1994 года среда языков программирования изменилась, я не знаю, как стандарт CL будет меняться / развиваться, чтобы приспособиться к тому, что было изучено с тех пор. Мир катится вперед, и, насколько я могу судить, CL стоит на месте. Мне нравится CL, у Clojure есть какой-то способ приблизиться к его мощи, но я не вижу, как CL будет развиваться - если вы собираетесь использовать стандартизованные языки, эволюционный путь должен быть очевиден. Без него язык, скорее всего, не является практическим выбором.
dnolen
4
CL эволюционировал и развивается благодаря множеству очень полезных библиотек. Базовый язык уже в 1994 году был более мощным, чем все «современные» языки сегодня.
Svante
5

Я предпочитаю CL, так как мне нравится объектно-ориентированное программирование, а CLOS - лучшая объектная система.

перекресток
источник
5
Говоря о CL, я бы порекомендовал либо ClozureCL, либо SBCL. Оба имеют открытый исходный код, хорошо документированы, зрелые, многоплатформенные и предоставляют важные нестандартные функции, такие как многопоточность.
Дэниел Дикисон
5

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

Вот интересная статья о том, почему MIT перешел со схемы на Python в своем вводном курсе программирования.

jinsungy
источник
3

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

Например, у Scheme есть продолжения, и хорошо бы узнать о них в Scheme, даже если они могут быть реализованы в Common Lisp.

Важно понимать разницу между лексической и динамической областью видимости, и если вы изучите и Common Lisp, и elisp, вы столкнетесь с последствиями обоих.

Justinhj
источник
0

LFE (Erlang со вкусом Lisp) было бы неплохо. У вас может быть синтаксис lisp поверх виртуальной машины Erlang.


источник
0

Для начала это был своего рода "загруженный" вопрос, но OP, вероятно, не знал об этом. В общем, списки Common и Scheme похожи на компьютерных «людей» ПК и Apple, они не смешиваются. Какой из них лучше, вероятно, не так важен, как тот, который «работает» для вас. На самом деле, особой разницы нет. Вероятно, предпочтение одного из них другому может зависеть от того, какой из них вы узнаете первым. (Для меня пустой список должен быть «ничем», известным в CL как NIL, и это делает меня Common Lisper.) Мне нравится интеграция SBCL со Slime с использованием EMACS, но SBCL подходит не всем. Во-первых, SBCL очень строгий. Если вы просто хотите «повеселиться», GNU clisp прост и доступен практически для каждой платформы.

Wiley
источник