Ответ 1
Это немного сложный вопрос, поскольку различия являются как техническими, так и, что более важно, на мой взгляд, культурными. Ответ может только когда-либо давать неточную, субъективную точку зрения. Это то, что я собираюсь предоставить здесь. Для некоторых исходных технических деталей см. Scheme Wiki.
Схема - это язык, основанный на принципе предоставления элегантного, последовательного, хорошо продуманного базового языкового субстрата, на котором могут быть основаны как практические, так и академические языки приложений.
Редко вы обнаружите, что кто-то записывает приложение в чистую схему R5RS (или R6RS), и из-за минималистического стандарта большинство кода не переносимо в реализациях Схемы. Это означает, что вам нужно будет тщательно выбирать реализацию Схемы, если вы хотите написать какое-то приложение для конечного пользователя, потому что выбор во многом определит, какие библиотеки доступны для вас. С другой стороны, относительная свобода при разработке реального языка приложений означает, что реализации Схемы часто предоставляют функции, не имеющие аналогов в других местах; Например, PLack Racket позволяет использовать статическую типизацию и обеспечивает очень понятную для языка среду IDE.
Взаимодействие вне базового языка обеспечивается посредством процесса SRFI, управляемого сообществом, но доступность любого данного SRFI зависит от реализации.
Большинство диалектов и библиотек схем сосредоточены на функциональных идиомах программирования, таких как рекурсия, а не на итерации. Существуют различные объектные системы, которые вы можете загружать в виде библиотек, когда хотите делать ООП, но интеграция с существующим кодом в значительной степени зависит от диалекта Схемы и ее окружающей культуры (например, курица-схема более объектно ориентирована, чем Racket).
Интерактивное программирование - это еще одна точка, в которой разные подкомпоненты Scheme отличаются. Схема MIT известна сильной интерактивной поддержкой, в то время как PLT Racket чувствует себя намного более статичным. В любом случае интерактивное программирование, по-видимому, не является главной проблемой для большинства подкомпонентов Scheme, и мне еще предстоит увидеть среду программирования, аналогичную интерактивной, как и большинство Common Lisps.
Общий Lisp - это испорченный бит язык, предназначенный для практического программирования. Он полон уродливых бородавок и совместимых хаков - совершенно противоположно элегантному минимализму Схемы. Но это также гораздо более характерно, если взять на себя.
Общий Lisp породил относительно большую экосистему портативных библиотек. Обычно вы можете переключать реализации в любое время, даже после развертывания приложения, без особых проблем. В целом, общий Lisp гораздо более равномерен, чем схема, и более радикальные языковые эксперименты, если они вообще выполняются, обычно внедряются как переносная библиотека, а не определяют совершенно новый языковой диалект. Из-за этого языковые расширения имеют тенденцию быть более консервативными, но также более комбинируемыми (и часто необязательными).
Универсальные языковые расширения, такие как интерфейсы внешних функций, не разрабатываются формальными средствами, а полагаются на квазистандартные библиотеки, доступные во всех основных реализациях Lisp.
Языковые идиомы - это дикая смесь функциональных, императивных и объектно-ориентированных подходов, и в целом Common Lisp больше похож на императивный язык, чем на функциональный. Это также чрезвычайно динамично, возможно, больше, чем любой из популярных динамических языков сценариев (например, переопределение класса применяется к существующим экземплярам, а система обработки условий имеет интерактивность, встроенную в нее), а интерактивное поисковое программирование является важной частью "Общий способ Lisp". Это также отражается в среде программирования, доступной для Common Lisp, практически все из которых предлагают какое-то прямое взаимодействие с работающим компилятором Lisp.
Common Lisp имеет встроенную систему объектов (CLOS), систему обработки условий значительно более мощную, чем простая обработка исключений, временная патч-доступность и различные встроенные структуры данных и утилиты (включая пресловутые LOOP macro, итерационный подъярус, слишком уродливый для Scheme, но слишком полезный, чтобы не упоминать, а также механизм форматирования, подобный printf, с Поддержка GOTO в строках формата).
Как из-за интерактивной разработки на основе изображений, так и из-за более крупного языка, реализации Lisp обычно менее переносимы в разных операционных системах, чем реализации Схемы. Например, получение общего Lisp для запуска на встроенном устройстве не для слабонервных. Подобно виртуальной машине Java, вы также сталкиваетесь с проблемами на компьютерах, где ограничена виртуальная память (например, на виртуальных серверах на базе OpenVZ). С другой стороны, реализации схем имеют более компактный и портативный характер. Возрастающее качество реализации ECL несколько смягчило этот момент, хотя его сущность по-прежнему остается в силе.
Если вам нужна коммерческая поддержка, есть несколько компаний, которые предоставляют свои собственные Common Lisp реализации, включая графические графические GUI-сборщики, специализированные системы баз данных и т.д.
Подводя итоги, схема - более элегантный дизайн. Это прежде всего функциональный язык с некоторыми динамическими функциями. Его реализации представляют собой различные несовместимые диалекты с отличительными особенностями. Общий Lisp - это полноценный, высокодинамичный, многопарадигменный язык с различными уродливыми, но прагматичными функциями, реализация которых в значительной степени совместима друг с другом. Диалекты схемы, как правило, более статичны и менее интерактивны, чем Common Lisp; Обычные реализации Lisp имеют тенденцию быть более тяжелыми и сложными для установки.
Какой бы язык вы ни выбрали, я желаю вам много удовольствия!:)