Подтвердить что ты не робот

Каковы фактические различия между Схемой и общим Lisp? (Или любые другие два диалекта Lisp)

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

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

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

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

4b9b3361

Ответ 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 имеют тенденцию быть более тяжелыми и сложными для установки.

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

схема:

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

общий lisp:

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

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