Які відмінності між Clojure, Scheme / Racket та Common Lisp?


120

Я знаю, що це діалекти того ж сімейства мови, що називається lisp, але які саме відмінності? Чи можете ви дати огляд, якщо це можливо, охоплюючи такі теми, як синтаксис, характеристики, особливості та ресурси.


3
Я прошу більш загальний огляд відмінностей, оскільки мені подобається, що це питання може бути корисним для багатьох інших людей, вибачте, якщо це звучить образливо.
MaiaVictor

4
Мене завжди бентежить, яка посада повинна куди подітися. Це обговорення інструментів, тож це питання тут або до програмістів? Логічно, я б сказав, перенесіть це на програмістів, тому що це не прохання вирішити конкретну проблему, але це хороший пост з хорошою відповіддю IMHO.
восьминоги граббус

1
@octopusgrabbus: питання занадто широке. Порівнюючи три мови програмування за «синтаксисом, характеристиками, особливостями та ресурсами», можна легко заповнити книгу чи веб-сайт. Stackoverflow призначений для людей, які мають проблеми з програмуванням, це не енциклопедія (Wikipedia), це не загальний дискусійний форум (Usenet), це не сайт порівняння мов ( rosettacode.org ). Найкраще для реальної проблеми програмування, коли питання має код, а відповіді - код. Плюс: Не створюйте проблем тільки тому, що комусь нудно або це хобі.
Rainer Joswig

3
Тільки тому, що питання широке, не означає, що воно тут не належить. Це абсолютно чітке питання, і це, звичайно, "справжнє питання програмування". StackOverflow має на увазі насамперед ресурс [googleable] спільноти для обміну знаннями про програмування через формат запитань.
Ден Бертон

@RainerJoswig, я міг просто написати все, що я дізнався про ці мови за останні дні, коли я їх вивчав, але це зробить нитку великою. Це дуже погано, коли ти розумієш, що люди будуть гугнути таким коротким реченням і не зможуть отримати відповідь, оскільки великий текст заважає їм швидко зрозуміти, про що їм задають питання. Цей спосіб гарантує, що набагато більше людей допоможе хороша відповідь.
MaiaVictor

Відповіді:


103

Всі вони мають багато спільного:

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

Загальні відмінні риси Lisp:

Відмінні риси Clojure:

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

Особливості схеми:

  • Можливо, найпростіший і найпростіший у навчанні Лісп
  • Гігієнічні макроси (див. Http://en.wikipedia.org/wiki/Hygienic_macro ) - елегантно уникає проблем із випадковим захопленням символів у макророзширеннях

11
це добре, але, можливо, ви повинні згадати, що ракетка - це більше, ніж "просто" схема; це система, яка підтримує кілька (але споріднених) мов (ви навіть можете визначити свою власну). Крім того, у clojure є різні способи програмування, схожих на oo (і багаторазовий диспетчерський підхід нечітко схожий на clos, і щось ближче до java, що є більш ефективним у jvm). і схема наближається до більш стандартних бібліотек (які також включають oo) з r6rs, яка підтримує ракетку.
andrew cooke

2
"Сильно набрана динамічна мова" - це маркетинг. У цьому сенсі навіть Python сильно набраний.
ron

16
@ron: Python є строго типізований, так само , як Lisp ( в відміну скажімо JavaScript , або VB). Ви думаєте, натомість "статичне введення" та "динамічне введення тексту", див. En.wikipedia.org/wiki/Type_system для всіх різновидів. Але так, це маркетинг
Нас Банов

2
Я також думаю, що Ракетку було б добре додати до цієї відповіді. Я б подумав, що Ракетку навчитись навіть простіше, ніж схему, через спільність та зосередженість мови. Ракетка (раніше названа PLT Scheme) - це програма програмування багатопарадигми загального призначення в родині Lisp / Scheme. Одна з його цілей дизайну - служити платформою для створення мови, проектування та впровадження мови.
mtelesha

Clojure має гігієнічні макроси. Більше інформації тут: xivilization.net/~marek/blog/2013/09/17/…
Крістофер Кутрюфф

50

Люди вище пропустили кілька речей

  1. Common Lisp також має вектори та хеш-таблиці. Різниця полягає в тому, що Common Lisp використовує # () для векторів, а не синтаксис для хеш-таблиць. У схемі є вектори, я вважаю

  2. У звичайному Lisp є читальні макроси, які дозволяють використовувати нові дужки (як це робить Racket, нащадок схеми).

  3. Схеми та Clojure мають гігієнічні макроси, на відміну від негігієнічних звичайних Lisp

  4. Усі мови є сучасними або мають масштабні проекти оновлення. За останні п’ять років Common Lisp отримав широкі бібліотеки (в основному завдяки Quicklisp), схема має деякі сучасні реалізації (Ракетка, Курка, Схема Chez тощо), а Clojure створений порівняно недавно

  5. Common Lisp має вбудовану систему OO, хоча вона сильно відрізняється від інших систем OO, які ви могли використовувати. Примітно, що воно не застосовується - ви не маєте писати код OO.

  6. Мови мають дещо різні філософії дизайну. Схема була розроблена як мінімальний діалект для розуміння моделі актора; згодом він став використовуватися для педагогіки. Загальний Лісп був розроблений для об'єднання безлічі діалектів Ліспа, що виникли. Clojure був розроблений для одночасності. Як результат, схема має репутацію мінімальної та елегантної, звичайний Lisp - потужний та парадигмально-агностичний (функціональний, OO, що завгодно) та Clojure, що надає перевагу функціональному програмуванню.


4
Ракетка не є реалізацією схеми, що забороняє режими сумісності. Дивіться stackoverflow.com/questions/3345397
помилка

Clojure зовсім НЕ мають гігієнічні макроси, як я знайшов важкий шлях.
піон

40

Не забувайте про відмінності Lisp-1 та Lisp-2.

Схема та Clojure - це Lisp-1:
це означає, що імена змінних, і функцій знаходяться в одному просторі імен.

Загальний Lisp - це Lisp-2:
Функція та змінні мають різні простори імен (насправді, CL має багато просторів імен).


-4

Gimp написаний у схемі :)

Насправді багато програмного забезпечення, на думку деяких людей, може бути написане на мові C ++, ймовірно, було зроблено під парасолькою Lisp, що важко вибирати золоті яблука з купки. Справа в тому, що C ++ не завжди був популярним, він лише здається популярним сьогодні через історію оновлень. Протягом меншої половини століття C ++ навіть не використовував багатопотоковість, саме сьогодні Python є вигрібною ямою непотрібного неперевіреного баггі-клею. Трохи швидше, і зараз ми спостерігаємо зростання функціонального програмування, воно більше схоже на адаптацію або вмирання. Я думаю, що Java має це правильно, що стосується адаптованої частини.

Схема була спроектована для спрощення мови Lisp, це було єдиним її наміром, за винятком того, що воно ніколи насправді не натрапляло. Я думаю, що Clojure робить щось подібне, що означало спрощення схеми для JVM більше. Це як і будь-яка інша мова JVM просто там, щоб надути користувальницький досвід, лише для спрощення написання кофейної панелі на землі Java.


2
"означало спростити схему для JVM нічого більше" ", як і будь-яку іншу мову JVM" Так, правильно.
oskarkv

4
Gimp написаний на C, і він підтримує схеми, Python та Perl як мови сценаріїв.
lbalazscs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.