Ви хочете шукати баланс між простотою та чистотою, привабливими функціями та платформою, яка дозволить вам писати цікаве та корисне програмне забезпечення (для себе), а також служити інструментом навчання. (Це останнє допоможе вам продовжувати навчатися набагато довше.) Ось декілька можливостей:
Схема. Мабуть, найчистіший з усіх діалектів. Не викликає сумнівів, чому «Маленький Схемер» було перекладено з LISP на Схему. Стандартна специфікація п’ятої схеми, R5RS , сама по собі є чудовою освітою; це може бути найкраща специфікація мови та бібліотеки, яку я коли-небудь читав, а також найкоротша, яка є досить вичерпною. Платформа PLT Scheme (нині Racket) включає досить пристойний інтерпретатор та компілятор, добре підходить для сценаріїв, а також має деякі візуальні інструменти, які роблять її чудовою для навчання.
Загальний Lisp. Ймовірно, це найбільш портативний і всеосяжний варіант, це, швидше за все, те, що ви хочете, якщо хочете писати такі речі, як комерційне програмне забезпечення. Стандарт визначає обширні бібліотеки, і багато іншого доступно більше, він має CLOS , який, мабуть, навчить вас більше про OO, ніж будь-яка мова OO, і деякі компілятори дуже хороші. До недоліків належать деякі бородавки, яких у Scheme немає (наприклад, наявність окремого простору імен для змінних, що посилаються на функції), не настільки чисті та прості (як у випадку з усім, що мало мати розширення та робити компроміси необхідними для великих додатків у реальному світі), не маючи гігієнічних макросів, і наголошуючи на рекурсії набагато менше, ніж схема.
Клоджуре.Це працює на JVM, що може завадити йому розробників Java. У нього є кілька бородавок (наприклад, потрібно чітко попросити оптимізувати хвостовий виклик, хоча це може змінитися одного дня, якщо до JVM буде додано TCO). Макроси, хоча і не є гігієнічними, мають деякі функції, які допоможуть вам уникнути захоплення змінних, тому ви можете захоплювати змінні, якщо ви дійсно хочете, при цьому ризик випадково зробити менше, ніж у CL. Ви отримали легкий доступ до всіх бібліотек Java; це, мабуть, добре для коду "реального світу" і досить безглуздо з точки зору навчання. Він має набір бібліотек для постійних структур даних та підтримку STM, що робить його дуже цікавим з одночасної точки зору; це робить це, мабуть, найкращим вибором, якщо ви Вам цікаво дізнатись більше про нові методи роботи з паралельним та паралельним програмуванням. Схоже, що Clojure настільки ж придатний для використання у великих виробничих додатках, як Java, в тому сенсі, що він матиме можливість робити "некрасиві речі", які ви робите у виробничих додатках, чого ви волієте не робити і не робити коли ти вчишся.
Emacs Lisp. З точки зору LISP, це не один з найкращих прикладів. Однією з найбільших його несправностей є динамічний масштаб, але є багато інших. Однак якщо ви користувач Emacs, це може бути найпотужнішим інструментом, який ви можете навчитися покращувати використання редактора. Однак, скільки б ви насправді дізналися, вивчаючи Emacs Lisp, окрім того, як розширити Emacs, для мене відкрите питання; Я не знаю, як часто такі цікаві методи, як функції високого порядку, насправді використовуються в Emacs Lisp.
2018 Оновлення
Минуло майже десятиліття з того моменту, як я написав цю публікацію, і, як видається, сім'я мов Ліспа зараз набуває значного значення в загальній свідомості програмістів. Багато з цього, як видається, пов'язано з Clojure, який не тільки став належно відокремленим діалектом Ліспа, представляючи багато своїх власних добрих ідей, але і тепер має майже ідентичну версію, націлену на JavaScript, і надихнув багатьох інших Лісп орієнтація на інші платформи. Наприклад, Hy націлений на CPython AST та байт-код, прагнучи спочатку до сумісності з Python, але використовуючи ідеї Clojure "у випадку сумнівів". (Хоча з останніх комітів, останні можуть дещо змінитися.)
Велика зміна, яку це приносить у процесі прийняття рішень, полягає в тому, що ви також повинні розглядати всі доступні мови Lisps або подібні до Lisp і взаємодіяти з мовами чи платформами, якими ви вже користуєтесь, будь то Perl , Ruby , Erlang , Go або навіть C ++ на мікроконтролерах .