it-roy-ru.com

Какой диалект LISP я должен изучить?

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

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

81
Humphrey Bogart

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

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

  2. Common LISP. Вероятно, наиболее переносимый и всеобъемлющий вариант, это, скорее всего, то, что вам нужно, если вы хотите писать такие вещи, как коммерческое программное обеспечение. Стандарт определяет обширные библиотеки, и многие другие доступны помимо этого, он имеет CLOS , что, вероятно, научит вас больше о OO, чем любой OO язык мог, и некоторые из компиляторов очень хороши. Недостатки включают в себя некоторые бородавки, которых нет в 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, и вдохновил многих других Лисп ориентация на другие платформы. Например, Hy предназначается для CPython AST и ​​байт-кода, нацеливаясь прежде всего на взаимодействие с Python, но используя идеи Clojure "в случае сомнений". (Хотя из последних коммитов, последний может немного измениться.)

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

67
Curt J. Sampson

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

21
J. Polfer

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

9
Leslie P. Polzer

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

Нельзя сказать, что я не наслаждаюсь CL или Схемой. Я узнал Схему с SICP. И CL привел меня в Clojure. Все зависит от ваших целей, я полагаю. Если вы хотите выучить LISP, который очень практичен, переходите на Clojure. В противном случае CL ​​или Scheme оба великолепны.

8
dnolen

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

Вот интересная статья о Почему MIT переключился с Scheme на Python в своем вводном курсе по программированию.

5
jinsungy

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

5
jrockway

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

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

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

3
justinhj

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

0
Wiley

LFE (LISP Flavored Erlang) будет хорошим. Вы можете использовать синтаксис LISP поверх виртуальной машины Erlang.

0
user235273