У Common Lisp великое наследие?(Лучше ли изучать Common Lisp или более современный вариант, такой как Scheme?) - PullRequest
15 голосов
/ 12 ноября 2010

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

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

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

Мне не нравится изучать другого монстра, такого как C ++. Правда ли, что CL похож на C ++ в семействе Lisp? А Scheme похож на, скажем, C # или Java - «исправленный» C ++.

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

Ответы [ 3 ]

18 голосов
/ 13 ноября 2010

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

И Common Lisp, и Scheme shareнаследие Lisp: символы, s-выражения, car, cdr, cons, списки на основе cons-ячеек, ... и многое другое.

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

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

11 голосов
/ 12 ноября 2010

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

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

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

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

4 голосов
/ 12 ноября 2010

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

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

...