it-roy-ru.com

Каковы различия между Clojure, Scheme / Racket и Common Lisp?

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

111
MaiaVictor

Все они имеют много общего:

  • Динамические языки
  • строго набрано
  • Скомпилированный
  • Синтаксис в стиле LISP, то есть код записывается в виде структур данных (форм) LISP, причем наиболее распространенным шаблоном являются вызовы функций, такие как: (function-name arg1 arg2)
  • Мощные системы макросов, которые позволяют вам обрабатывать код как данные и генерировать произвольный код во время выполнения (часто используется для "расширения языка" с помощью нового синтаксиса или создания DSL)
  • Часто используется в стиле функционального программирования, хотя имеет возможность приспособиться к другим парадигмам
  • Акцент в интерактивной разработке с REPL (т.е. вы интерактивно разрабатываете в работающем экземпляре кода)

Общие отличительные черты LISP:

Отличительные особенности Clojure:

  • Крупнейшая библиотечная экосистема, поскольку вы можете напрямую использовать любые библиотеки Java
  • Векторы [] и карты {}, используемые в качестве стандарта в дополнение к стандартным спискам () - в дополнение к общей полезности векторов и карт, некоторые считают, что это нововведение, которое делает в целом более читабельным
  • Большой акцент на неизменяемости и ленивом функциональном программировании, вдохновленный Хаскеллом
  • Мощные возможности параллелизма, поддерживаемые программной транзакционной памятью на уровне языка (стоит посмотреть: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

Отличительные особенности схемы:

  • Возможно, самый простой и легкий в изучении LISP
  • Гигиенические макросы (см. http://en.wikipedia.org/wiki/Hygienic_macro ) - элегантно избегает проблем со случайным захватом символов в расширениях макросов
94
mikera

Люди выше пропустили несколько вещей

  1. Common LISP также имеет векторы и хеш-таблицы. Разница в том, что Common LISP использует # () для векторов и не использует синтаксис для хеш-таблиц. Схема имеет векторы, я считаю

  2. В Common LISP есть макросы для чтения, которые позволяют использовать новые скобки (как и Racket, потомок Scheme).

  3. Scheme и Clojure имеют гигиенические макросы, в отличие от негигиеничных Common LISP

  4. Все языки либо современные, либо имеют обширные проекты реновации. За последние пять лет Common LISP получил обширные библиотеки (в основном благодаря Quicklisp), Scheme имеет некоторые современные реализации (Racket, Chicken, Chez Scheme и т.д.), А Clojure был создан сравнительно недавно

  5. Common LISP имеет встроенную OO систему, хотя она сильно отличается от других OO систем, которые вы могли использовать. Примечательно, что он не применяется - вы не не имеете для написания кода OO.

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

47
Cosman246

Не забывайте о различиях между LISP-1 и LISP-2.

Схема и Clojure представляют собой ЛИСП-1:
Это означает, что имена переменных и функций находятся в одном и том же пространстве имен.

Общий LISP - это LISP-2:
Функция и переменные имеют разные пространства имен (на самом деле, CL имеет много пространств имен).

36
paul