Имеет ли Common Lisp отличное наследие? (Лучше ли вы изучить Common Lisp или более современный вариант, такой как Scheme?)

Я хочу узнать какой-то язык из семейства Lisp. Это может быть CL или Scheme и использовать его для веб-программирования. Просто для удовольствия. У меня есть значительный опыт на С++ (дошкольное развитие).

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

Я не могу решить, что лучше: CL или Scheme. CL имеет гораздо большую и стандартизованную библиотеку и фреймворки (Weblocks), но я слышал, что у нее многозначность в своем синтаксисе и библиотеках. Схема другая: простой, сжатый синтаксис, но плохая библиотека. Я бы предпочел CL, если у него нет никакого наследия.

Мне не нравится изучать другого монстра, такого как С++. Верно ли, что CL похож на С++ в семействе Lisp? И схема похожа, скажем, на С# или Java - "переработана" на С++.

Изменить: Я хочу писать в функциональном стиле, OOP может быть, но необязательно.

Ответы

Ответ 1

Common Lisp имеет много особенностей, некоторые из них, вероятно, связаны с наследием (не знаю, как моя история Lisp достаточно хорошо, чтобы сказать наверняка). Там довольно много бородавок, таких как несоответствия в функциональной номенклатуре и аргументации. Но сам язык сам по себе, хотя и немного странный, довольно здравый. В отличие от, скажем, С++...

У схемы есть бородавки, но я бы подумал в меньшей степени. С другой стороны, стандартная библиотека Scheme является крошечной по сравнению с CL, поэтому там также меньше места для бородавок.: -)

Помимо простых реализаций CL и Scheme, у вас также есть пара "Lisp следующего поколения", например Clojure (возможно самые "современные" из них - разработаны с нуля для тяжелых concurrency) и newLISP, а "следующее поколение Scheme", Racket (ранее известный как PLT Scheme).

Я лично очень впечатлен Racket, и я надеюсь, что когда-нибудь смогу использовать его для чего-то.

Ответ 2

Схема была изобретена в середине 70-х годов.

CL был разработан с 1982 года. Первое определение было опубликовано в 1984 году: Common Lisp Language.

Эта схема не имеет никакого наследия или более современна, это миф. Схема была определена до Common Lisp почти на десятилетие. Схема все еще имела наследие, подобное s-выражениям, cons-клеткам, символам, автомобилю, cdr, cons и т.д. Эта схема имеет наследие, что делает ее членом семейства языков Lisp, который имеет свои корни в первом Lisp с 1958 года.

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

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

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

Общие Lisp добавили с первого дня множество функций, которые считались полезными:

  • Лексическое связывание по умолчанию
  • записи (называемые структуры)
  • базовая библиотека
  • I/O
  • объявления типа
  • списки аргументов с аргументами ключевого слова
  • подсказки компилятора
  • читатель

и многое другое.

в середине 90-х годов была опубликована ревизия CL. Он добавил:

  • объектная система с необязательным протоколом метаобъектов
  • обширная система обработки ошибок, система условий

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

В схеме было больше изменений в ее стандарте, но основные дизайнерские решения остались, и сообщество боролось с основами, такими как обработка ошибок, записи, объектная система и т.д. R6RS оказался спорным, и я согласен с критиками. Я считаю, что R6RS крайне разочаровывает как в своем направлении, так и в его содержании.

Есть еще две точки зрения: полустандарты и отдельные реализации.

Сообщество Scheme разработало множество полустандартных расширений. Это следует рассматривать как успех.

Реализации OTOH широко расходились для Схемы. В них мало консенсуса. Существует много очень небольших реализаций и множество больших реализаций.

Реализации CL OTOH уже содержат большой язык, поэтому они не начинаются с малого. Аргументы ключевого слова есть. То же самое для объектной системы. Со временем многие приложения убедились, что они могут работать практически без изменений во многих реализациях. Кроме того, в отдельных реализациях добавлено множество функций, таких как поддержка Unicode, потоки, одновременное выполнение и т.д. И т.д.

Таким образом, текущие реализации Lisp могут иметь множество функций.

Оба Common Lisp и схема разделяют наследие списков Lisp: символы, s-выражения, car, cdr, cons, cons,... и многое другое.

Общие Lisp имеют некоторые части, которые не так велики, но определены в стандарте. Одним из примеров является то, что имена символов CL внутри внутреннего языка. Идея "последовательностей" в стандарте не расширяется. И более. Отдельные реализации управляют многими ограничениями стандарта CL. Так, например, в большинстве реализаций система ввода/вывода написана с помощью CLOS, условия основаны на CLOS, существуют расширяемые последовательности для SBCL и т.д.

CL может быть огромным языком, но это не С++. Многие детали на удивление хорошо спроектированы и просты в использовании. Многие проблемы также могут быть устранены пользователем, поскольку Common Lisp - программируемый язык программирования. Вам не нравится встроенный LOOP? Используйте ITERATE, если вам нравится больше или даже написать свой собственный.

Ответ 3

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

Я бы рекомендовал книгу The Little Schemer и либо Racket, либо Petite Chez Scheme (оба являются бесплатными), если вы хотите изучить функциональное программирование.