Каковы реальные различия между Scheme и Common Lisp? (Или любые другие два диалекта Лисп) - PullRequest
65 голосов
/ 20 марта 2011

Примечание: я не спрашиваю, чему учиться, что лучше или что-то в этом роде.

Я выбрал бесплатную версию SICP, потому что чувствовал, что было бы неплохо прочитать (я слышал об этом хорошие вещи, и меня интересует такая сторона программирования).

Я знаю, что Схема - это диалект Лиспа, и я подумал: а в чем же разница между Схемой и, скажем, Common Lisp?

Кажется, много говорится о том, что "CL имеет больший stdlib ... Схема не подходит для программирования в реальном мире ...", но на самом деле нет слов, говорящих "это потому, что CL это / имеет это".

Ответы [ 4 ]

89 голосов
/ 21 марта 2011

Это немного сложный вопрос, поскольку различия носят как технический, так и (на мой взгляд, более важный) характер.Ответ может дать только неточный субъективный взгляд.Это то, что я собираюсь предоставить здесь.Некоторые необработанные технические подробности см. В Scheme Wiki .

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

Редко вы найдете кого-то, пишущего приложение на чистой R5RS (или R6RS) схеме, и из-за минималистического стандарта большая часть кода не переносима по всей схемереализации.Это означает, что вам придется тщательно выбирать реализацию Scheme, если вы захотите написать какое-то приложение для конечного пользователя, потому что выбор во многом определит, какие библиотеки вам доступны.С другой стороны, относительная свобода в разработке реального языка приложения означает, что реализации Scheme часто предоставляют функции, невиданные в других местах;PLT Racket, например, позволяет вам использовать статическую типизацию и обеспечивает IDE с большим вниманием к языку.

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

Большинство диалектов и библиотек Scheme фокусируются на идиомах функционального программирования, таких как рекурсия, а не итерация.Существуют различные объектные системы, которые можно загружать в виде библиотек, когда вы хотите выполнить ООП, но интеграция с существующим кодом в значительной степени зависит от диалекта Scheme и окружающей его культуры (например, Chicken Scheme выглядит более объектно-ориентированным, чем Racket).

Интерактивное программирование - это еще один момент, которым отличаются подсистемы Scheme. MIT Scheme известна сильной поддержкой интерактивности, в то время как PLT Racket чувствует себя намного более статичным.В любом случае, интерактивное программирование, похоже, не является главной проблемой для большинства сообществ Scheme, и мне еще предстоит увидеть среду программирования, аналогичную интерактивной, как у большинства Common Lisps.

Common Lisp это боевой язык, разработанный для практического программирования.Он полон уродливых бородавок и хаков совместимости - полная противоположность элегантному минимализму Схемы.Но он также гораздо более интересен, если брать его за себя.

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

Универсально полезные языковые расширения, такие как интерфейсы сторонних функций, не разрабатываются с помощью формальных средств, а полагаются на квази-стандартные библиотекидоступно во всех основных реализациях Common Lisp.

Языковые идиомы представляют собой дикую смесь функциональных, императивных и объектно-ориентированных подходов, и в целом Common Lisp больше напоминает императивный язык, чем функциональный.Он также чрезвычайно динамичен, возможно, в большей степени, чем любой из популярных динамических языков сценариев (например, переопределение классов применяется к существующим экземплярам, ​​а система обработки условий имеет встроенную интерактивность), и интерактивное, исследовательское программирование является важной частью«Обычный Лисп».Это также отражено в средах программирования, доступных для Common Lisp, практически все из которых предлагают своего рода прямое взаимодействие с работающим компилятором Lisp.

Common Lisp имеет встроенную объектную систему (CLOS), систему обработки условий, значительно более мощную, чем простая обработка исключений, возможность исправления во время выполнения, и различные виды встроенных структур данных и утилит (включая пресловутую * 1027).Макрос * LOOP , итерационный подъязык, слишком уродливый для Scheme, но слишком полезный, чтобы не упоминать, а также механизм форматирования, похожий на printf с поддержкой GOTO в строках форматирования).

Как из-за интерактивной разработки на основе изображений, так и из-за более широкого языка реализации Lisp обычно менее переносимы между операционными системами, чем реализации Scheme.Например, запуск Common Lisp для работы на встроенном устройстве не для слабонервных.Подобно виртуальной машине Java, вы также склонны сталкиваться с проблемами на машинах, где виртуальная память ограничена (например, виртуальные серверы на основе OpenVZ).Реализации схем, с другой стороны, имеют тенденцию быть более компактными и переносимыми.Повышение качества реализации ECL несколько смягчило этот момент, хотя его суть по-прежнему верна.

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

Подводя итог , Scheme - более элегантный язык.Это в первую очередь функциональный язык с некоторыми динамическими характеристиками.Его реализации представляют различные несовместимые диалекты с отличительными чертами.Common Lisp - это полноценный, высокодинамичный, мультипарадигмальный язык с различными уродливыми, но прагматичными функциями, чьи реализации в значительной степени совместимы друг с другом.Диалекты схемы, как правило, более статичны и менее интерактивны, чем Common Lisp;Обычные реализации Lisp, как правило, тяжелее и сложнее в установке.

Какой бы язык вы ни выбрали, я желаю вам много веселья!:)

19 голосов
/ 22 марта 2011

Некоторые основные практические отличия:

  • Common Lisp имеет отдельные области для переменных и функций; тогда как в Scheme есть только одна область видимости - функции являются значениями, а определение функции с определенным именем - это просто определение переменной, заданной для лямбда-выражения. В результате в Scheme вы можете использовать имя функции в качестве переменной и сохранять или передавать его другим функциям, а затем выполнять вызов с этой переменной, как если бы это была функция. Но в Common Lisp вам нужно явно преобразовать функцию в значение, используя (function ...), и явно вызвать функцию, сохраненную в значении, используя (funcall ...)
  • В Common Lisp nil (пустой список) считается ложным (например, в if) и является единственным ложным значением. На схеме пустой список считается истинным, а (отличное) #f является единственным ложным значением
8 голосов
/ 20 марта 2011

На этот вопрос сложно ответить беспристрастно, особенно потому, что многие люди из LISP классифицируют Scheme как LISP.

Джош Блох (и эта аналогия, возможно, не является его изобретением) описывает выбор языка как родственныйк выбору местного паба.В этом свете:

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

Паб "LISP"?Ну ... я не должен комментировать;Я не провел там достаточно времени:).

2 голосов
/ 20 марта 2011

схема:

  • изначально очень мало спецификаций (новый R7RS кажется тяжелее)
  • благодаря простому синтаксису схему можно быстро выучить
  • реализации предоставляют дополнительные функции, но имена могут отличаться в разных реализациях

общий шрифт:

  • многие функции определены большей спецификацией
  • другое пространство имен для функций и переменных (lisp-2)

это некоторые моменты, конечно, есть еще много, которые я сейчас не помню.

...