Який діалект Ліспа мені слід вивчити? [зачинено]


89

Я знаю, що існує кілька різних діалектів Ліспа. Вирішивши, що вивчення Lisp буде новим інтелектуальним досвідом, я хотів би знати, який діалект Lisp вивчати, і чому.

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



Я досліджував це перед тим, як задати це, але характер питання змінювався, коли я його набирав. Я переконаюсь, що не буду винаходити колесо заново.
Хамфрі Богарт,

То яка різниця між цим запитанням та тим, яке згадав Грег вище?
cjs

2
Я думаю, що він намагався сказати: коли я вперше сформулював своє запитання в думках, воно абсолютно відрізнялося від поточного, і, переглядаючи запитання, пов’язані з відповідним пошуком, не виявилося жодного, що відповідає тому, що він хотів. запитати. Але до того моменту, як він набрав питання, воно змінилося і, отже, надійшло до SO у його нинішній формі, яка була задана раніше.
Дж. Полфер

Відповіді:


77

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

  1. Схема. Мабуть, найчистіший з усіх діалектів. Не викликає сумнівів, чому «Маленький Схемер» було перекладено з LISP на Схему. Стандартна специфікація п’ятої схеми, R5RS , сама по собі є чудовою освітою; це може бути найкраща специфікація мови та бібліотеки, яку я коли-небудь читав, а також найкоротша, яка є досить вичерпною. Платформа PLT Scheme (нині Racket) включає досить пристойний інтерпретатор та компілятор, добре підходить для сценаріїв, а також має деякі візуальні інструменти, які роблять її чудовою для навчання.

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

  3. Клоджуре.Це працює на JVM, що може завадити йому розробників Java. У нього є кілька бородавок (наприклад, потрібно чітко попросити оптимізувати хвостовий виклик, хоча це може змінитися одного дня, якщо до JVM буде додано TCO). Макроси, хоча і не є гігієнічними, мають деякі функції, які допоможуть вам уникнути захоплення змінних, тому ви можете захоплювати змінні, якщо ви дійсно хочете, при цьому ризик випадково зробити менше, ніж у CL. Ви отримали легкий доступ до всіх бібліотек Java; це, мабуть, добре для коду "реального світу" і досить безглуздо з точки зору навчання. Він має набір бібліотек для постійних структур даних та підтримку STM, що робить його дуже цікавим з одночасної точки зору; це робить це, мабуть, найкращим вибором, якщо ви Вам цікаво дізнатись більше про нові методи роботи з паралельним та паралельним програмуванням. Схоже, що Clojure настільки ж придатний для використання у великих виробничих додатках, як Java, в тому сенсі, що він матиме можливість робити "некрасиві речі", які ви робите у виробничих додатках, чого ви волієте не робити і не робити коли ти вчишся.

  4. Emacs Lisp. З точки зору LISP, це не один з найкращих прикладів. Однією з найбільших його несправностей є динамічний масштаб, але є багато інших. Однак якщо ви користувач Emacs, це може бути найпотужнішим інструментом, який ви можете навчитися покращувати використання редактора. Однак, скільки б ви насправді дізналися, вивчаючи Emacs Lisp, окрім того, як розширити Emacs, для мене відкрите питання; Я не знаю, як часто такі цікаві методи, як функції високого порядку, насправді використовуються в Emacs Lisp.

2018 Оновлення

Минуло майже десятиліття з того моменту, як я написав цю публікацію, і, як видається, сім'я мов Ліспа зараз набуває значного значення в загальній свідомості програмістів. Багато з цього, як видається, пов'язано з Clojure, який не тільки став належно відокремленим діалектом Ліспа, представляючи багато своїх власних добрих ідей, але і тепер має майже ідентичну версію, націлену на JavaScript, і надихнув багатьох інших Лісп орієнтація на інші платформи. Наприклад, Hy націлений на CPython AST та байт-код, прагнучи спочатку до сумісності з Python, але використовуючи ідеї Clojure "у випадку сумнівів". (Хоча з останніх комітів, останні можуть дещо змінитися.)

Велика зміна, яку це приносить у процесі прийняття рішень, полягає в тому, що ви також повинні розглядати всі доступні мови Lisps або подібні до Lisp і взаємодіяти з мовами чи платформами, якими ви вже користуєтесь, будь то Perl , Ruby , Erlang , Go або навіть C ++ на мікроконтролерах .


3
Наявність окремих просторів імен - це не бородавка, це просто інше дизайнерське рішення. Майте на увазі, що в Схемі вже є кілька інших просторів імен, тому дискусія швидше йде про Lisp-5 проти Lisp-6. Окрім зручності, що я можу назвати список "списком", а автомобіль "автомобілем" у CL, його макросистема є набагато практичнішою та кориснішою, оскільки компілятор не так легко плутає речі.
Svante

Clojure не має оптимізації виклику хвоста, і не може, оскільки байт-код JVM не підтримує її. Все, що вона має, - це "повторна" спеціальна форма, яка самостійно повторює поточну функцію.
Svante

3
Curt: Я стверджую, що Clojure є найбільш портативним, оскільки він працює на Java VM.
justinhj

1
Я не знаю про це; якщо ви виключити невеликі та вбудовані пристрої (такі як телефони та смарт-карти), де ви все одно не збираєтеся запускати немодифіковану програму для робочого столу / сервера, elisp, безумовно, працює на набагато більшій кількості процесорів та платформ, ніж JVM.
cjs

1
Я категорично не згоден. Рекурсія, як правило, створює код, який а) більш чистий, б) легший для перевірки, в) з більшою ймовірністю буде правильним. Більш докладно: а) він має тенденцію менше торкатися меншої кількості змінних поза функцією; б) індуктивний доказ має тенденцію природним чином випадати з рекурсивної функції, тоді як із циклами потрібно перевіряти інваріанти циклу тощо; в) надійність походить від а) і від того, що вас, як правило, штовхають на кодування таким чином, що, природно, змушує вас робити (можливо, неформально) індуктивне доведення b).
cjs

22

Я б сказав "Схема", виключно завдяки " Маленькій схемі", яка є однією з найдивовижніших веселих, але надзвичайно важких книг, які я коли-небудь намагався прочитати.


15
Не забувайте про SICP! mitpress.mit.edu/sicp . Це класичне читання.
Джоріс Тіммерманс,

7
Було два-три видання «Маленького Лиспера», перш ніж «Маленький Шемер» вийшов у перекладі.
cjs

9

Я можу порекомендувати Common Lisp на SBCL . Ця комбінація є швидкою, потужною, зрілою та добре задокументованою.


8

Крім того, Clojure набуває багато розуму в наші дні, і з поважної причини. Чудові структури даних, глибоко хороша підтримка одночасності (викликає ганьбу в цьому плані Scheme та CL) та велике співтовариство. Це також відносно просто, CL так само принаймні настільки ж складний, як і C ++.

Це не означає, що мені не подобається CL чи схема. Я вивчив схему з SICP. І CL привів мене до Clojure. Все залежить від ваших цілей, я гадаю. Якщо ви хочете вивчити Lisp, який є надзвичайно практичним, перейдіть до Clojure. В іншому випадку CL або Scheme - це чудово.


Здається, це означає, що ні CL, ні схема не є "надзвичайно практичними", хоча насправді вони є цілком практичними. Особливо стандарт CL народився з практичних міркувань.
Leslie P. Polzer

2
Мова програмування змінилася з 1994 року, я не знаю, як стандарт CL буде змінюватися / еволюціонувати відповідно до того, що вивчалося з того часу. Світ рухається вперед, і, наскільки я можу сказати, CL стоїть на місці. Мені подобається CL, Clojure повинен пройти якийсь шлях, щоб наблизити свою силу, але я не бачу, як CL буде розвиватися - якщо ви збираєтеся використовувати стандартизовані мови, еволюційний шлях повинен бути очевидним. Без нього мова, швидше за все, не є практичним вибором.
dnolen

4
CL еволюціонував і розвивається через безліч дуже корисних бібліотек. Базова мова вже була потужнішою в 1994 році, ніж усі сучасні мови сьогодні.
Сванте

5

Я віддаю перевагу CL, оскільки мені подобається об'єктно-орієнтоване програмування, а CLOS - найкраща об'єктна система навколо.


5
Говорячи про CL, я б рекомендував ClozureCL або SBCL. Обидва вони є відкритими, добре задокументованими, зрілими, мультиплатформенними та забезпечують важливу нестандартну функціональність, як багатопотоковість.
Деніел Дікісон

5

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

Ось цікава стаття на тему чому MIT перейшов зі схеми на Python у своєму вступному курсі програмування.


3

Я б сказав, що всі вони, принаймні спочатку. Врешті-решт, ви, мабуть, сформуєте перевагу до схеми або загальної ліспи, але вони обидва мають достатньо відмінностей, що найкраще зрозуміти все, що там є.

Наприклад, у Scheme є продовження, і добре дізнатися про них у Scheme, хоча їх можна реалізувати в Common Lisp.

Важливо вивчити різницю між лексичним та динамічним обсягом, і якщо ви вивчите як Common Lisp, так і elisp, ви натрапите на наслідки обох.


0

LFE (Erp з ароматом липи) було б непогано. Ви можете мати синтаксис lisp поверх Erlang VM.


0

Для початку це було своєрідне "завантажене" питання, але ОП, мабуть, не знав про це. Як правило, Common та Schepers lispers - це як "люди" для ПК та Apple, вони не змішуються. Який з них найкращий, мабуть, не такий актуальний, як той, який "працює" для вас. Справді, різниці не так вже й багато. Можливо, на перевагу одного над іншим може вплинути той, який ви дізнаєтесь першим. (Для мене порожній список повинен бути "нічим", відомий в CL як NIL, і це робить мене Common Lisper.) Мені подобається інтеграція SBCL із Slime за допомогою EMACS, але SBCL не для всіх. З одного боку, SBCL є дуже суворим. Якщо ви просто хочете "повеселитися", список GNU є простим і доступним практично для будь-якої платформи.

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