Які фактичні відмінності між Scheme та Common Lisp? (Або будь-які інші два діалекти Ліспа)


83

Примітка: Я не запитую, що вчити, що краще чи щось подібне.

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

Я знаю, що Схема - це діалект Ліспа, і я задався питанням: яка справжня різниця між Схемою та, скажімо, Спільним Ліспе?

Здається, є багато про те, що "CL має більший stdlib ... Схема не підходить для реального програмування ..", але жодної фактичної речі не сказано: "це тому, що CL це це / має це".


4
"Схема не підходить для реального програмування" ... Я займаюся програмуванням у реальному світі в схемі (добре, не так багато).
knivil

Не впевнений, що це підтекст, але я б порадив просто виконувати вправи SICP у схемі. Ви можете використовувати майже будь-яку реалізацію з правильними параметрами, оскільки підмножина, на яку вони зосереджені, настільки мала. Вам просто потрібно знайти правильні параметри на ваш вибір, наприклад, у Racket це, мабуть, буде режим R5RS. Багато ідей від SICP допоможуть вам у подальшому дослідженні Lisp, навіть якщо ви продовжите використовувати Common Lisp або навіть Clojure.
michiakig

12
Останнє, що я бачив, специфікація схеми становила близько 50 сторінок, а специфікація CL - понад 1000. Тож просто відкрийте специфікацію CL для будь-якої сторінки, і є велика ймовірність, що це щось у CL, але не Scheme. :-)
Кен

@knivil Я цитував інші запитання щодо SO, які я бачив, які використовувати.
Комуністична качка,

1
можливий дублікат Common Lisp або Scheme?
nawfal

Відповіді:


104

Це дещо складне запитання, оскільки відмінності є як технічними, так і (що, що важливіше, на мій погляд) культурними. Відповідь може дати лише неточний, суб’єктивний погляд. Це те, що я збираюся надати тут. Деякі вихідні технічні подробиці див. У схемі Wiki .

Схема - це мова, побудована на принципі забезпечення елегантної, послідовної, продуманої основи базової мови, на якій можуть бути побудовані як практичні, так і академічні мови застосування.

Рідко ви зустрінете когось, хто пише додаток із чистою схемою R5RS (або R6RS), і через мінімалістичний стандарт більшість кодів не можна переносити в реалізаціях схеми. Це означає, що вам доведеться ретельно вибирати реалізацію своєї схеми, якщо ви захочете написати якусь програму для кінцевого користувача, оскільки вибір значною мірою визначатиме, які бібліотеки вам доступні. З іншого боку, відносна свобода у розробці фактичної мови додатків означає, що реалізації схеми часто надають функції, нечувані деінде; Наприклад, PLT-ракетка дозволяє використовувати статичне введення тексту та забезпечує дуже знану мову IDE.

Взаємодія за межами базової мови забезпечується процесом SRFI, керованим спільнотою, але доступність будь-якого даного SRFI залежить від реалізації.

Більшість діалектів та бібліотек Схеми зосереджуються на функціональних ідіомах програмування, таких як рекурсія замість ітерації. Існують різні об'єктні системи, які ви можете завантажувати як бібліотеки, коли хочете зробити ООП, але інтеграція з існуючим кодом сильно залежить від діалекту Схеми та навколишньої культури (Куряча Схема, схоже, більш об'єктно-орієнтована, ніж Ракет, наприклад).

Інтерактивне програмування - ще один момент, в якому розрізняються підгрупи Scheme. Схема MIT відома сильною підтримкою інтерактивності, тоді як PLT Racket відчуває себе набагато статичніше. У будь-якому випадку, інтерактивне програмування, здається, не є основною проблемою для більшості підспільнот Схеми, і я ще не бачив середовища програмування настільки ж інтерактивного, як і найбільш поширені Ліспи.

Common Lisp - це виснажена мова, призначена для практичного програмування. Він сповнений потворних бородавок та зламань сумісності - цілком протилежний елегантному мінімалізму Схеми. Але це також набагато цікавіше, якщо взяти для себе.

Common Lisp створив відносно велику екосистему портативних бібліотек. Зазвичай ви можете змінити реалізацію в будь-який час, навіть після розгортання програми, без зайвих проблем. Загалом, Common Lisp набагато більш уніфікований, ніж Scheme, і більш радикальні мовні експерименти, якщо взагалі їх робити, зазвичай вбудовуються як портативна бібліотека, а не визначають цілком новий діалект мови. Через це розширення мови, як правило, є більш консервативними, але також і більш комбінованими (і часто необов’язковими).

Універсально корисні розширення мови, такі як інтерфейси із зовнішніми функціями, не розробляються формально, а спираються на квазістандартні бібліотеки, доступні у всіх основних реалізаціях Common Lisp.

Мовні ідіоми - це дика суміш функціонального, імперативного та об’єктно-орієнтованого підходів, і загалом Common Lisp відчуває себе більше імперативною мовою, ніж функціональною. Це також надзвичайно динамічно, можливо більше, ніж будь-яка з популярних мов динамічного сценарію (перевизначення класу застосовується, наприклад, до існуючих примірників, а система обробки умов має вбудовану інтерактивність), а інтерактивне, дослідницьке програмування є важливою частиною "загальнодоступний шлях". Це також відображається в середовищах програмування, доступних для Common Lisp, практично всі вони пропонують якусь пряму взаємодію з запущеним компілятором Lisp.

Common Lisp має вбудовану об'єктну систему (CLOS), систему обробки умов, значно потужнішу, ніж просто обробка винятків, можливість виправлення часу виконання та різні типи вбудованих структур даних та утиліт (включаючи горезвісний макрос LOOP , ітерацію підмова занадто потворна для Scheme, але занадто корисна, щоб не згадувати, а також механізм форматування подібний до printf з підтримкою GOTO у рядках формату).

І через інтерактивну розробку на основі зображень, і через більшу мову, реалізації Lisp, як правило, менш портативні в операційних системах, ніж реалізації схеми. Отримати Common Lisp для роботи на вбудованому пристрої, наприклад, не для слабонервних. Подібно до віртуальної машини Java, ви також стикаєтеся з проблемами на машинах, де віртуальна пам’ять обмежена (наприклад, віртуальні сервери на основі OpenVZ). З іншого боку, реалізації схем, як правило, є більш компактними та портативними. Зростання якості впровадження ECL дещо пом'якшило цей момент, хоча його суть все ще відповідає дійсності.

Якщо вам потрібна комерційна підтримка, є кілька компаній, які надають свої власні реалізації Common Lisp, включаючи графічний графічний графічний інтерфейс, спеціалізовані системи баз даних тощо.

Підводячи підсумок , схема - це більш елегантно розроблена мова. Це насамперед функціональна мова з деякими динамічними властивостями. Його реалізації представляють різні несумісні діалекти з відмінними рисами. Common Lisp - це повноцінна, високодинамічна, багатопарадигмна мова з різними потворними, але прагматичними рисами, реалізації яких значною мірою сумісні між собою. Діалекти схеми, як правило, є більш статичними та менш інтерактивними, ніж Common Lisp; Загальні реалізації Lisp, як правило, важчі та складніші у встановленні.

Яку б мову ви не вибрали, я бажаю вам багато задоволення! :)


7
should you want to write some kind of end-user application+1
kmoe

23

Деякі основні практичні відмінності:

  • Common Lisp має окремі області для змінних та функцій; тоді як у схемі є лише одна сфера застосування - функції є значеннями, а визначення функції з певним іменем - це просто визначення змінної, встановленої на лямбда-значення. Як результат, у схемі ви можете використовувати ім'я функції як змінну та зберігати або передавати його іншим функціям, а потім виконувати виклик із цією змінною, як якщо б це була функція. Але в Common Lisp вам потрібно явно перетворити функцію у значення за допомогою (function ...)і явно викликати функцію, що зберігається у значенні, використовуючи(funcall ...)
  • У Common Lisp nil(порожній список) вважається помилковим (наприклад, in if) і є єдиним хибним значенням. У схемі порожній список вважається істинним, а (різний) #fє єдиним хибним значенням

Для мене перший момент, який робить @newacct, є найважливішим, безумовно. Якщо функції не є першокласними об'єктами, для мене втрачається багато справді цікавого, "креативного" програмування. Добре, можуть бути "практичні" міркування щодо швидкості тощо, але якщо я хочу функціональне, незмінне програмування, просто немає порівняння, IMHO. І якщо я хочу практичності, я можу поїхати до Клоджуре і отримати найкраще з обох світів. Common Lisp має своє місце, але я підозрюю, що це у світі "промисловості", де я впевнений, люди дуже вдячні за це.
Alex Gian

2
CL все ще має першокласні функції. Те, що він має окремий простір імен для функцій, не означає, що він не має функцій першого класу (так, потрібно трохи більше синтаксису, але це все ).
mwal

Щодо: функціонування в CL, більшою перешкодою є відсутність обов'язкових TCO. Звичайно, деякі реалізації підтримують це, але тоді це означає, що ви більше не пишете портативний код CL, і портативність, здається, є однією з основних моментів
Coderino Javarino,

8

На це важко відповісти неупереджено, особливо тому, що багато хто з LISP класифікує Scheme як LISP.

Джош Блох (і ця аналогія може бути не його винаходом) описує вибір мови як подібний до вибору місцевого пабу. У такому світлі тоді:

У пабі "Схема" багато дослідників мов програмування. Ці люди приділяють багато уваги значенню мови, дотриманню її чітко визначеною та простою та обговоренню нових нових можливостей. Кожен має власну версію мови, розроблену для того, щоб дозволити їм вивчити свій власний куточок мов програмування. Людям схеми дуже подобається синтаксис у дужках, який вони взяли з LISP; він гнучкий, легкий та рівномірний та усуває багато перешкод для розширення мови.

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


2

схема:

  • спочатку дуже мало специфікацій (новий R7RS здається важчим)
  • завдяки легкому синтаксису схему можна швидко вивчити
  • реалізації надають додаткові функції, але імена можуть відрізнятися в різних реалізаціях

загальний шепелявий:

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

це деякі моменти, впевнені, що їх набагато більше, чого я зараз не пам’ятаю.


1
Ви маєте на увазі "RSR7"; замість цього має бути "R6RS".
Джон Клементс,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.