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

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

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

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

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


person The Communist Duck    schedule 20.03.2011    source источник
comment
Scheme не подходит для программирования в реальном мире ... Я занимаюсь программированием в реальном мире на Scheme (хорошо, не очень).   -  person knivil    schedule 20.03.2011
comment
Не уверен, что это подтекст, но я бы рекомендовал просто выполнять упражнения SICP в Scheme. Вы можете использовать практически любую реализацию с правильными параметрами, потому что подмножество, на котором они сосредоточены, очень мало. Вам просто нужно будет подобрать нужные параметры на ваш выбор, например, в Racket, вероятно, будет R5RS-mode. Многие идеи от SICP помогут вам в дальнейшем изучении Лиспа, даже если вы продолжите использовать вместо него Common Lisp или даже Clojure.   -  person michiakig    schedule 20.03.2011
comment
Последнее, что я видел, спецификация Scheme составляла около 50 страниц, а спецификация CL - более 1000. Так что просто откройте спецификацию CL на любой странице, и велики шансы, что это что-то, что есть в CL, но не в Scheme. :-)   -  person Ken    schedule 20.03.2011
comment
@knivil Я цитировал другие вопросы SO, которые я видел, о том, что использовать.   -  person The Communist Duck    schedule 20.03.2011
comment
возможный дубликат Common Lisp или схемы?   -  person nawfal    schedule 21.07.2014


Ответы (4)


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

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

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

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

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

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

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

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

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

Языковые идиомы представляют собой дикая смесь функционального, императивного и объектно-ориентированного подходов, и в целом Common Lisp больше похож на императивный язык, чем на функциональный. Он также чрезвычайно динамичен, возможно, в большей степени, чем любой из популярных динамических языков сценариев (например, переопределение класса применяется к существующим экземплярам, ​​а система обработки условий имеет встроенную интерактивность), а интерактивное исследовательское программирование является важной частью "путь Common 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; Реализации Common Lisp обычно тяжелее и сложнее в установке.

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

person Matthias Benkard    schedule 20.03.2011

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

  • Common Lisp имеет отдельные области видимости для переменных и функций; тогда как в Scheme есть только одна область видимости - функции являются значениями, а определение функции с определенным именем - это просто определение переменной, установленной для лямбда. В результате в Scheme вы можете использовать имя функции в качестве переменной и сохранять или передавать его другим функциям, а затем выполнять вызов с этой переменной, как если бы это была функция. Но в Common Lisp вам нужно явно преобразовать функцию в значение, используя (function ...), и явно вызвать функцию, хранящуюся в значении, используя (funcall ...)
  • В Common Lisp nil (пустой список) считается ложным (например, в if) и является единственным ложным значением. В схеме пустой список считается истинным, а (отдельный) #f - единственным ложным значением.
person newacct    schedule 22.03.2011
comment
Для меня первое, что делает @newacct, безусловно, является самым важным. Если функции не являются первоклассными объектами, я теряю большую часть действительно забавного творческого программирования. Хорошо, могут быть практические соображения относительно скорости и т. Д., Но если я хочу функциональное, неизменяемое программирование, здесь просто нет сравнения, ИМХО. А если мне нужна практичность, я могу перейти на Clojure и получить лучшее из обоих миров. Common Lisp имеет свое место, но я подозреваю, что он находится в мире индустрии, и я уверен, что люди ему очень благодарны. - person Alex Gian; 04.09.2018
comment
CL по-прежнему имеет первоклассные функции. То, что у него есть отдельное пространство имен для функций, не означает, что у него нет функций первого класса (да, требуется немного больше синтаксиса, но это все). - person mwal; 26.04.2019
comment
re: функционально в CL, более серьезным препятствием является отсутствие обязательной совокупной стоимости владения. Конечно, некоторые реализации поддерживают это, но тогда это означает, что вы больше не пишете переносимый код CL, и переносимость кажется одной из основных точек рисования. - person Coderino Javarino; 04.09.2020

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

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

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

Паб "ЛИСП"? Что ж ... Я не должен комментировать; Я не провел там достаточно времени :).

person John Clements    schedule 20.03.2011

схема:

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

обычная шепелявка:

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

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

person Moe    schedule 20.03.2011
comment
Вы ссылаетесь на RSR7; вместо этого это должен быть R6RS. - person John Clements; 20.03.2011