Вы хотите найти баланс между простотой и чистотой, привлекательными функциями и платформой, которая позволит вам писать интересное и полезное программное обеспечение (для себя), а также служить инструментом обучения. (Это последнее поможет вам продолжить и учиться намного дольше.) Вот несколько возможностей:
Схема. Наверное, самый чистый из всех диалектов. Несомненно, именно поэтому The Little Schemer был переведен с LISP на Scheme. Пятая стандартная спецификация схемы, R5RS , сама по себе является прекрасным образованием; это может быть самая хорошая спецификация языка и библиотеки, которую я когда-либо читал, а также самая короткая и достаточно всеобъемлющая. Платформа PLT Scheme (теперь Racket) включает в себя довольно приличный интерпретатор и компилятор, хороша для написания сценариев, а также имеет некоторые визуальные инструменты, которые делают ее отличной для обучения.
Common Lisp. Вероятно, наиболее переносимый и всеобъемлющий вариант, это, скорее всего, то, что вам нужно, если вы хотите писать такие вещи, как коммерческое программное обеспечение. Стандарт определяет обширные библиотеки, и многие другие доступны помимо этого, в нем есть CLOS , который, вероятно, научит вас больше об объектно-ориентированном программировании, чем любой объектно-ориентированный язык, а некоторые из компиляторов очень хороши. К недостаткам можно отнести некоторые недостатки, которых у Scheme нет (например, наличие отдельного пространства имен для переменных, которые относятся к функциям), не столь ясный и простой (как в случае со всем, что должно было иметь расширения и делать необходимые компромиссы. для больших приложений в реальном мире), не имея гигиенических макросов и уделяя рекурсии гораздо меньше внимания, чем Scheme.
Clojure.Он работает на JVM, что может дать ему преимущество для разработчиков Java. У него есть несколько недостатков (например, вы должны явно запросить оптимизацию хвостового вызова, хотя однажды это может измениться, если TCO будет добавлена к JVM). Макросы, хотя и не являются гигиеничными, все же имеют некоторые функции, которые помогут вам избежать захвата переменных, поэтому вы можете захватывать переменные, если действительно хотите, при этом с меньшим риском случайности, чем в CL. У вас есть легкий доступ ко всем библиотекам Java; это, вероятно, хорошо для кода «реального мира» и довольно бессмысленно с точки зрения обучения. В нем есть набор библиотек для постоянных структур данных и поддержка STM, что делает его очень интересным с точки зрения параллелизма; это, вероятно, ваш лучший выбор, если вы Вам интересно узнать больше о новых методах работы с параллельным и параллельным программированием. Похоже, что Clojure можно использовать для больших производственных приложений так же, как и Java, в том смысле, что он будет иметь возможность делать «уродливые вещи», которые вы делаете в производственных приложениях, которые вы бы предпочли не делать и не делать. когда ты учишься.
Emacs Lisp. С точки зрения LISP, это не один из лучших примеров. Один из самых больших недостатков - динамическое определение объема, но есть и много других. Однако, если вы пользователь Emacs, это может быть самый мощный инструмент, который вы можете изучить, чтобы улучшить использование редактора. Однако насколько многому вы действительно научитесь, изучая Emacs Lisp, помимо того, как расширять Emacs, для меня вопрос открытый; Я не знаю, как часто в Emacs Lisp действительно используются интересные методы, такие как функции высокого порядка.
Обновление 2018
Прошло почти десять лет с тех пор, как я написал этот пост, и теперь семейство языков Lisp, похоже, приобретает значительную популярность в сознании программистов. Многое из этого, похоже, связано с Clojure, который не только стал отдельным диалектом Lisp сам по себе, представляя многие из своих собственных хороших идей, но также теперь имеет почти идентичную версию, нацеленную на JavaScript, и вдохновил многие другие Lisp. таргетинг на другие платформы. Например, Hy нацелен на CPython AST и байт-код, в первую очередь стремясь к взаимодействию с Python, но используя идеи Clojure «в случае сомнения». (Хотя из последних коммитов, последние могут немного измениться.)
Большое изменение, которое это вносит в ваш процесс принятия решений, заключается в том, что вы также должны смотреть на все доступные Lisps или подобные Lisp языки и взаимодействовать с языками или платформами, которые вы уже используете, будь то Perl , Ruby , Erlang , Go или даже C ++ на микроконтроллерах .