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


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

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

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

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

4 59

4 ответа:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

схема:

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

common lisp:

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

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