Я знаю, что это диалекты того же семейства языков, что и lisp, но в чем именно отличия? Не могли бы вы дать обзор, если это возможно, охватывающий такие темы, как синтаксис, характеристики, функции и ресурсы.
В чем разница между Clojure, схемой/ракетами и общим Lisp?
Ответ 1
Все они имеют много общего:
- Динамические языки
- Сильно напечатано
- Составитель
- Lisp -стильный синтаксис, то есть код записывается в виде структур данных (форм) Lisp, причем наиболее распространенным шаблоном являются вызовы функций, такие как:
(function-name arg1 arg2)
- Мощные макросистемы, которые позволяют вам обрабатывать код как данные и генерировать произвольный код во время выполнения (часто используется для "расширения языка" с помощью нового синтаксиса или создания DSL)
- Часто используется в стиле функционального программирования, хотя и обладает возможностью размещения других парадигм
- Акцент в интерактивной разработке с помощью REPL (т.е. вы интерактивно разрабатываете в исполняемом экземпляре кода)
Общие Lisp отличительные особенности:
- Мощная подсистема OOP (Общая Lisp Система объектов)
- Вероятно, лучший компилятор (Common Lisp является самым быстрым Lisp в соответствии с http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.html, хотя в нем мало чего.....)
Clojure отличительные особенности:
- Самая большая библиотечная экосистема, поскольку вы можете напрямую использовать любые библиотеки Java.
- Векторы
[]
и карты{}
, используемые в качестве стандарта в дополнение к стандартным спискам()
- в дополнение к общей полезности векторов и карт, некоторые считают, что это инновация, которая делает в целом более удобочитаемым. - Больше внимания уделяется неизменности и ленивому функциональному программированию, несколько вдохновленному Haskell
- Сильные concurrency возможности, поддерживаемые программной транзакционной памятью на уровне языка (стоит посмотреть: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey)
Особенности схемы:
- Возможно, самый простой и простой способ узнать Lisp
- Гигиенические макросы (см. http://en.wikipedia.org/wiki/Hygienic_macro) - изящно избегает проблем с случайным захватом символов в макроразложениях
Ответ 2
Люди выше пропустили несколько вещей
-
Общие Lisp также имеют векторы и хэш-таблицы. Разница в том, что Common Lisp использует #() для векторов и не имеет синтаксиса для хеш-таблиц. У схемы есть векторы, я полагаю,
-
Общие Lisp имеют макросы читателей, которые позволяют использовать новые скобки (как и Racket, потомок схемы).
-
Схема и Clojure имеют гигиенические макросы, в отличие от Common Lisp негигиеничных
-
Все языки являются современными или имеют обширные проекты по реконструкции. Общий Lisp получил за последние пять лет обширные библиотеки (в основном благодаря Quicklisp), Scheme имеет некоторые современные реализации (Racket, Chicken, Chez Scheme и т.д.), А Clojure был создан сравнительно недавно
-
Common Lisp имеет встроенную систему OO, хотя она сильно отличается от других OO-систем, которые вы могли использовать. Примечательно, что он не применяется - вам не нужно писать код OO.
-
Языки имеют несколько иные концепции дизайна. Схема была разработана как минимальный диалект для понимания Модели Актера; позже он стал использоваться для педагогики. Общий Lisp был разработан для объединения мириадов диалектов Lisp, которые возникли. Clojure был разработан для concurrency. В результате, Scheme имеет репутацию минимального и элегантного, Common Lisp того, что он мощный и парадигма-агностик (функциональный, OO, любой) и Clojure в пользу функционального программирования.
Ответ 3
Не забывайте о различиях Lisp -1 и Lisp -2.
Схема и Clojure: Lisp -1:
Это означает, что имена переменных и функций находятся в одном и том же пространстве имен.
Общий Lisp - Lisp -2:
Функция и переменные имеют разные пространства имен (на самом деле CL имеет много пространств имен).
Ответ 4
Gimp написан на схеме:)
На самом деле все программное обеспечение, которое, по мнению некоторых людей, могло бы быть написано на С++, возможно, было сделано под зонтиком Lisp, его трудно выделить золотые яблоки из группы. Дело в том, что С++ не всегда был популярен, он кажется популярным сегодня из-за истории обновлений. В течение меньшей половины века С++ даже не использовал многопоточность, именно там Python сегодня является выгребной ложью бесполезного непроверенного кода глючного клея. Fasterforward немного, и теперь мы наблюдаем рост функционального программирования, его больше похоже на адаптацию или смерть. Я думаю, что Java имеет право в части адаптации.
Схема была разработана, чтобы упростить язык Lisp, это было его единственное намерение, за исключением того, что он никогда не был пойман. Я думаю, что Clojure делает нечто похожее, чтобы упростить Схему для JVM. Он так же, как и любой другой JVM-язык, чтобы раздуть пользовательский интерфейс, только для упрощения написания шаблона на Java-землях.