it-swarm.com.ru

Каковы реальные различия между Scheme и Common Lisp? (Или любые другие два диалекта LISP)

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

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

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

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

63
The Communist Duck

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

88
Matthias Benkard

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

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

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

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

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

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

8
John Clements

схема:

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

общий LISP:

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

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

2
Moe