[Lisp] Отчет о первом подходе к снаряду. ч.1:Выбор версии
От: volk  
Дата: 09.03.09 13:53
Оценка: 77 (9) -2 :))) :)
Некоторое время назад я осуществил глубокое погружение в функциональное программирование. Не могу сказать, что овладел каким-то секретным знанием на этом пути, однако приобретенный опыт считаю ценным.

Если Вы только собираетесь освоить функциональный подход и выбираете язык для быстрого старта, то это сообщение будет для Вас полезным.

Я стартовал с изучения традиционного Лиспа и теперь попытаюсь описать некоторые плюсы и минусы этого подхода. Разнообразные фичи ФЯ здесь обсуждаться не будут. А будет обсуждаться сама возможность быстрого старта в Лиспе, наличие/отсутствие информации для начинающих, крутость кривой обучения, некоторые мифы про Лисп и отдельные подводные камни.


Для удобства разбиваю текст на несколько частей, которые буду выкладывать отдельными сообщениями.





Часть 1. Как его готовить.

Это один из ключевых моментов всей истории. Выбор реализации языка и среды разработки определяет процентов на 80%, сможете ли вы пробиться через вторичные трудности и приступить собственно к программированию. Выбирать надо не столько диалект и реализацию Лиспа, сколько сопутствующую версию редактора.

Дело в том, что от редактора Лиспа требуется больше, чем просто синтаксическая подсветка текста. Редактор должен реализовывать Read-Eval-Print Loop (коротко REPL), или попросту говоря, возможность интерактивного исполнения пользовательского ввода.

Конечно, можно работать и в привычном для императивного программиста режиме "пишем -- запускаем -- смотрим, почему взорвалось". Тогда в качестве редактора сойдет даже блокнот или, например, ConTEXT. Однако использование REPL резко сокращает усилия на старте. Действительно, это чертовски удобно, когда есть возможность посмотреть во что вычисляется любое выражение или только что написанная функция.

Работа с REPL в целом аналогична работе в популярных математических пакетах типа Matlab и Mathematica и является вообще огромным плюсом функционального подхода.


Выбирал исключительно те варианты, которые доступны под Windows -- не держу дома Линукс из экономии времени. Кроме того, учитывал распространенность диалекта, объем документации и примеров, а также размер community.

В итоге я рассматривал 5 вариантов конфигурации Лиспа и редактора.




Common Lisp + emacs + SLIME.

Это одна из стандартных и широко распространенных связок; я начал с нее.

Среди плюсов этого подхода:


Основным аругментом "за" был тот факт, что почти все диалекты и реализации Лиспов поддерживают работу с Emacs.

Вкратце: эта конфигурация для задач быстрого старта себя не оправдала нисколько.

Не буду описывать весь процесс настройки и конфигурирования; история нисколько не более захватывающая, чем рассказ на тему "как я поутру уронил ключи от сейфа в мусоропровод и как мне к вечеру удалось их там отыскать в районе второго этажа". Скажу только, что Emacs в связке со SLIME относится к наихудшей -- в плане легкости установки и настройки -- категории Open Source: "работает только с помощью лома и такой-то матери". Основные проблемы заключаются в поддержке совместимости между разными версиями Emacs, SLIME, Лиспа и ОС. Был ошарашен безалаберностью (граничащей с вредительством), с которой эта поддержка реализуется в конфигурационных скриптах SLIME. В некоторых случаях выбирается наихудшее решение из возможных.

Итого, связка Лисп + Emacs мне представляется злом по следующим причинам:
-- дьявольски неудобная настройка;
-- необходимость в нагрузку к Лиспу разбираться еще и в редакторе Emacs (Вы ведь не редакторами интересуетесь, а функциональными языками, не так ли?);
-- удобство использования Emacs также вопрос дискуссионный: хотя его адепты и обещают златые горы, по результатам анализа эти горы сделаны совсем из другого материала (есть мнение, что это какая-то органика ): набор фич хотя и богатый, но ничего блистательного в них нету, а эзотерические клавиатурные комбинации поначалу сильно осложнят жизнь.

В общем, Лисп + Emacs -- это слишком круто для начала, причем не из-за Лиспа, а из-за Emacs. Вы рискуете никогда не приступить к собственно программированию, погрязнув в настройках редактора. Причем не с целью приспособить его под себя, а просто чтоб заставить его работать.

Совершенно нормальным вариантом представляется переход под Emacs уже после освоения Лиспа; тогда кривая обучения будет не слишком крута.

Встречаются утверждения такого рода: "Все используют Лисп исключительно вместе emacs, и было бы глупо использовать что-то другое." Это, разумеется, неправда: не все, не исключтельно и не глупо. Приведенный PR-прогруз принадлежит emacs-фанатикам, да гореть им в аду навеки .

Кончено, если у вас под рукой есть знакомый, у которого все уже работает, просто возьмите у него готовую конфигурацию и не тратьте время.

Еще раз скажу, что все это относится к Windows-версиям софта; под Линуксом все должно быть гораздо лучше, потому что он является родной платформой для всего этого зоопарка.



Lisp in a Box

Это на самом деле тоже Лисп + Emacs, но позиционируется как предназначенный для начинающих. По замыслу авторов, дистрибутив должен избавить пользователя от кошмаров, свойственных предыдущему варианту конфигурации, за счет продуманных и доработанных настроек. Именно на этом свойстве дистрибутива делается основной акцент. В "Box" включен набор примеров из замечательной книги "Practical Common Lisp". В документации утверждается, что все должно заработать с полпинка, безо всякой настройки и без скачивания дополнительных компонент.

Ничего подобного: дополнительные компоненты скачивать пришлось, настройка потребовалась, с первого раза ничего не заработало. Хотя, конечно, довести Lisp in a Box до рабочей конфигурации несравненно легче, чем связку Лисп + Emacs.

Кроме того, находящиеся в Box-е реализации лиспов слегка подустарели, а для Windows их доступно всего две. Причем нужно сделать выбор "или-или"; обе реализации так вот запросто установить не удастся.

Итого: работать с этим можно, но от Emacs и от проблем конфигурирования тоже никуда не деться. Хотя масштаб этих проблем на порядок меньше.



Jaberwoocky

По-нашему говоря, Бармаглот. Проект "Бармаглот" -- вполне достойная попытка создать полноценную бесплатную IDE для Лиспа. Заявленный набор фич редактора почти такой же, как у Visual Studio; кроме того, есть REPL и интеграция с отладчиком.

Была выпущена стабильная версия 1.0 и бранч 2.0 (альфа-версия). Разработка остановилась в начале 2000-х, а полностью прекращена в 2004 году.

Эти обстоятельства удержали меня от того, чтобы вступить в бой с бармаглотом.

Наверное, это как-то работает. Но из соображений экономии времени лучше не проверять.



ABLE

ABLE означает A Basic Lisp Editor. Довольно свежий и развивающийся проект.

Не является IDE: не поддерживает "проекты", "Solutions" и т.п.
Как редактор реализует REPL, подсветку синтаксиса и расстановку отступов, настраиваемую помощь.

Установка и настройка заняли около 10 минут; усе заработало сразу. Чтения документации по редактору не требуется. Несмотря на минимализм, позволяет дорабатывать себя напильником, но этого совершенно не требуется. Легко интегрируется с ситемой сборки ASDF.

Минусы: опирается исключительно на реализацию CLisp, хотя и довольно свежую.

Является идеальным вариантом для изучения Common Lisp.



PLT Scheme

Scheme -- это диалект Лиспа, довольно далеко отошедший от Common Lisp.
В варианте PLT Scheme + DrScheme без проблем настраивается и работает, предоставляя нормальную IDE, хорошо проработанную документацию и набор учебных примеров.

PLT Scheme является идеальным вариантом для изучения Scheme. Но не для Common Lisp. PLT Scheme стоит брать, если стоит задача изучить основные концепции и отложить Лисп в сторону. Именно для такой цели этот язык и был разработан.


Что касается конкретной реализации Лиспа, здесь в равной степени распространены следующие экземпляры:


У меня сложилось впечатление, что для начала годится любой из них.





Итого:

    не начинайте со связки Lisp + Emacs -- это больно;

    чтобы быстро освоиться в Common Lisp, берите ABLE, если вам нужен Scheme -- берите PLT Scheme;

    выбор конкретной реализации Common Lisp для начала значения не имеет.




To be continued...
Тот, кто желает, но не делает, распространяет чуму.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.