В чем разница между Clojure, Scheme / Racket и Common Lisp?

120

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

MaiaVictor
источник
3
Я прошу дать более общий обзор различий, потому что я подумал, что этот вопрос может быть полезен для многих других людей, извините, если он звучит оскорбительно.
MaiaVictor
4
Я всегда не понимаю, какой пост куда должен идти. Это обсуждение инструментов, так это вопрос здесь или программистам? По логике, я бы посоветовал передать это программистам, потому что он не просит решить конкретную проблему, но это хороший пост с хорошим ответом ИМХО.
octopusgrabbus
1
@octopusgrabbus: вопрос слишком широкий. Сравнение трех языков программирования по «синтаксису, характеристикам, функциям и ресурсам» может легко заполнить книгу или веб-сайт. Stackoverflow предназначен для людей, у которых есть проблемы с программированием, это не энциклопедия (Википедия), это не общий дискуссионный форум (Usenet), это не сайт сравнения языков ( rosettacode.org ). Он лучше всего подходит для реальной проблемы программирования, когда в вопросе есть код, а в ответах тоже есть код. Плюс: не придумывайте проблемы только потому, что кому-то скучно или это хобби.
Rainer Joswig
3
Тот факт, что вопрос является широким, не означает, что ему здесь не место. Это совершенно ясный вопрос, и это, безусловно, «настоящий вопрос программирования». StackOverflow в первую очередь предназначен для [googleable] ресурса сообщества для обмена знаниями о программировании в формате вопросов и ответов.
Дэн Бертон
@RainerJoswig, я мог бы просто написать все, что я узнал об этих языках за последние дни, когда я их изучал, но это сделало бы обсуждение большим. Это действительно плохо, когда вы понимаете, что люди будут искать в Google такие короткие предложения и не смогут получить ответ, потому что большой текст мешает им быстро понять, о чем они спрашивают. Поступая таким образом, хороший ответ поможет гораздо большему количеству людей.
MaiaVictor

Ответы:

103

У всех них много общего:

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

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

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

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

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

  • Возможно, самый простой и легкий для изучения Лисп
  • Гигиенические макросы (см. Http://en.wikipedia.org/wiki/Hygienic_macro ) - элегантно избегает проблем со случайным захватом символов в расширениях макросов.
mikera
источник
11
это хорошо, но, пожалуй, стоит упомянуть, что рэкет - это больше, чем «просто» схема; это система, которая поддерживает несколько (но связанных) языков (вы даже можете определить свой собственный). Кроме того, у clojure есть различные способы выполнения oo-подобного программирования (как подход с множественной отправкой, отдаленно похожий на clos, так и что-то более близкое к java, что более эффективно на jvm). и схема приближается к более стандартным библиотекам (которые также включают oo) с r6rs, которые поддерживает racket.
Эндрю Кук
2
«Строго типизированный динамический язык» - это маркетинг. В этом смысле даже Python строго типизирован.
ron
16
@ron: Python является строго типизированным, так же , как Lisp ( в отличие скажем JavaScript , или VB). Вместо этого вы думаете о «статической типизации» против «динамической типизации», см. En.wikipedia.org/wiki/Type_system для всех разновидностей. Но да, это маркетинг
Нас Банов
2
Я также думаю, что к этому ответу неплохо было бы добавить Racket. Я думаю, что Racket даже легче выучить, чем Scheme из-за сообщества и направленности языка. Racket (ранее называвшийся PLT Scheme) - это многопарадигмальный язык программирования общего назначения из семейства Lisp / Scheme. Одна из целей его дизайна - служить платформой для создания, проектирования и реализации языков.
mtelesha
Clojure имеет гигиенические макросы. Больше информации здесь: xivilization.net/~marek/blog/2013/09/17/…
Кристофер Куттруфф
50

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

  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 имеет встроенную объектно-ориентированную систему, хотя она сильно отличается от других объектно-ориентированных систем, которые вы, возможно, использовали. Примечательно, что это не принудительно - вам не нужно писать объектно-ориентированный код.

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

Cosman246
источник
4
Racket не является реализацией Scheme, за исключением режимов совместимости. См. Stackoverflow.com/questions/3345397
ошибка
Clojure не имеет гигиенических макросов, как я обнаружил на собственном горьком опыте.
Пен
40

Не забывайте о различиях Lisp-1 и Lisp-2.

Scheme и Clojure - это Lisp-1:
это означает, что имена переменных и функций находятся в одном пространстве имен.

Common Lisp - это Lisp-2:
функция и переменные имеют разные пространства имен (фактически, CL имеет много пространств имен).

Павел
источник
-4

GIMP написан на схеме :)

На самом деле, часть программного обеспечения, которое, по мнению некоторых людей, могло быть написано на C ++, вероятно, было сделано под эгидой Lisp, трудно выделить золотые яблоки из этой кучи. Дело в том, что C ++ не всегда был популярен, он кажется популярным сегодня только из-за истории обновлений. Меньшую половину века C ++ даже не использовал многопоточность, именно здесь Python сегодня превратился в помойку бесполезного непроверенного кода с ошибками. Пройдите немного быстрее, и теперь мы наблюдаем рост функционального программирования, это больше похоже на адаптацию или смерть. Я думаю, что в части адаптации Java все правильно.

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

Meeple
источник
2
"предназначено для упрощения схемы для JVM, ничего лишнего" "как и любой другой язык JVM" Да, верно.
oskarkv
4
GIMP написан на C и поддерживает Scheme, Python и Perl в качестве языков сценариев.
lbalazscs