Я знаю, что есть несколько разных диалектов Лиспа. Решив, что изучение Лиспа станет новым интеллектуальным опытом, я хотел бы знать, какой диалект Лиспа изучать и почему.
Есть ли один более популярный, чем другие? Является ли какой-либо из них более "полным", лучше документированным и поддерживаемым? Какие плюсы и минусы этого диалекта?
Ответы:
Вы хотите найти баланс между простотой и чистотой, привлекательными функциями и платформой, которая позволит вам писать интересное и полезное программное обеспечение (для себя), а также служить инструментом обучения. (Это последнее поможет вам продолжить и учиться намного дольше.) Вот несколько возможностей:
Схема. Наверное, самый чистый из всех диалектов. Несомненно, именно поэтому The Little Schemer был переведен с LISP на Scheme. Пятая стандартная спецификация схемы, R5RS , сама по себе является прекрасным образованием; это может быть самая хорошая спецификация языка и библиотеки, которую я когда-либо читал, а также самая короткая и достаточно всеобъемлющая. Платформа PLT Scheme (теперь Racket) включает в себя довольно приличный интерпретатор и компилятор, хороша для написания сценариев, а также имеет некоторые визуальные инструменты, которые делают ее отличной для обучения.
Common Lisp. Вероятно, наиболее переносимый и всеобъемлющий вариант, это, скорее всего, то, что вам нужно, если вы хотите писать такие вещи, как коммерческое программное обеспечение. Стандарт определяет обширные библиотеки, и многие другие доступны помимо этого, в нем есть CLOS , который, вероятно, научит вас больше об объектно-ориентированном программировании, чем любой объектно-ориентированный язык, а некоторые из компиляторов очень хороши. К недостаткам можно отнести некоторые недостатки, которых у Scheme нет (например, наличие отдельного пространства имен для переменных, которые относятся к функциям), не столь ясный и простой (как в случае со всем, что должно было иметь расширения и делать необходимые компромиссы. для больших приложений в реальном мире), не имея гигиенических макросов и уделяя рекурсии гораздо меньше внимания, чем Scheme.
Clojure.Он работает на JVM, что может дать ему преимущество для разработчиков Java. У него есть несколько недостатков (например, вы должны явно запросить оптимизацию хвостового вызова, хотя однажды это может измениться, если TCO будет добавлена к JVM). Макросы, хотя и не являются гигиеничными, все же имеют некоторые функции, которые помогут вам избежать захвата переменных, поэтому вы можете захватывать переменные, если действительно хотите, при этом с меньшим риском случайности, чем в CL. У вас есть легкий доступ ко всем библиотекам Java; это, вероятно, хорошо для кода «реального мира» и довольно бессмысленно с точки зрения обучения. В нем есть набор библиотек для постоянных структур данных и поддержка STM, что делает его очень интересным с точки зрения параллелизма; это, вероятно, ваш лучший выбор, если вы Вам интересно узнать больше о новых методах работы с параллельным и параллельным программированием. Похоже, что Clojure можно использовать для больших производственных приложений так же, как и Java, в том смысле, что он будет иметь возможность делать «уродливые вещи», которые вы делаете в производственных приложениях, которые вы бы предпочли не делать и не делать. когда ты учишься.
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 ++ на микроконтроллерах .
источник
Я бы сказал Scheme исключительно из-за Little Schemer , одной из самых умопомрачительно забавных, но чрезвычайно сложных книг, которые я когда-либо пробовал читать.
источник
Я могу порекомендовать Common Lisp для SBCL . Эта комбинация быстрая, мощная, продуманная и хорошо задокументированная.
источник
Кроме того, Clojure в наши дни набирает популярность, и не зря. Отличные структуры данных, очень хорошая поддержка параллелизма (позор в этом плане Scheme и CL) и отличное сообщество. Это также относительно просто, CL не менее сложен, чем C ++.
Это не значит, что мне не нравится CL или Scheme. Я изучил схему с помощью SICP. И CL привел меня на Clojure. Полагаю, все зависит от ваших целей. Если вы хотите изучить очень практичный Лисп, выбирайте Clojure. В остальном CL или Scheme хороши.
источник
Я предпочитаю CL, так как мне нравится объектно-ориентированное программирование, а CLOS - лучшая объектная система.
источник
Я изучал схему в школе. Это был отличный опыт обучения, и я никогда не забуду основы функционального программирования. Вероятно, не имеет значения, какую версию LISP вы выберете, если вы понимаете суть его полезности - лямбда-исчисление без сохранения состояния.
Вот интересная статья о том, почему MIT перешел со схемы на Python в своем вводном курсе программирования.
источник
Я бы сказал все, по крайней мере, сначала. В конце концов, вы, вероятно, предпочтете Scheme или Common Lisp, но у них обоих достаточно различий, поэтому лучше всего разобраться со всем, что там есть.
Например, у Scheme есть продолжения, и хорошо бы узнать о них в Scheme, даже если они могут быть реализованы в Common Lisp.
Важно понимать разницу между лексической и динамической областью видимости, и если вы изучите и Common Lisp, и elisp, вы столкнетесь с последствиями обоих.
источник
LFE (Erlang со вкусом Lisp) было бы неплохо. У вас может быть синтаксис lisp поверх виртуальной машины Erlang.
источник
Для начала это был своего рода "загруженный" вопрос, но OP, вероятно, не знал об этом. В общем, списки Common и Scheme похожи на компьютерных «людей» ПК и Apple, они не смешиваются. Какой из них лучше, вероятно, не так важен, как тот, который «работает» для вас. На самом деле, особой разницы нет. Вероятно, предпочтение одного из них другому может зависеть от того, какой из них вы узнаете первым. (Для меня пустой список должен быть «ничем», известным в CL как NIL, и это делает меня Common Lisper.) Мне нравится интеграция SBCL со Slime с использованием EMACS, но SBCL подходит не всем. Во-первых, SBCL очень строгий. Если вы просто хотите «повеселиться», GNU clisp прост и доступен практически для каждой платформы.
источник