Lisp Часть 1. Общие вопросы

Материал из MediaWiki
Перейти к навигации Перейти к поиску

Несколько вопросов, которые могут возникнут у новичка, обратившего внимание на Lisp

Зачем нужен Lisp?

В самом деле зачем? Это же «архаичный, академический язык», на нём «никто не программирует», «он не востребован среди работодателей». Эти и подобные им высказывания, нередко можно услышать от людей вовсе незнакомых с lisp или в лучшем случае, когда-то немного слышавшими о нём в институте, от чего у них осталось лишь впечатление языка с огромным количеством скобок.

На самом деле всё не так. Lisp — современный высокоуровневый язык, на нём писались и пишутся и разные достаточно серьёзные системы и вещи попроще, навроде скриптов в разных средах, хотя есть конечно области, где Lisp применять было бы неразумно, например, для реализации вычислительных методов. Отчасти верны лишь слова про работодателей. Действительно, Lisp сейчас применяется не так широко. Попытки ответить на вопрос «почему» выходят далеко за рамки FAQ, но на взгляд составителя огромную роль играет просто банальное незнание его возможностей и имеющихся инструментов. Тем не менее, есть и серьёзные работодатели у которых знание Lisp прямо указано в требованиях к вакансиям.

Кроме того, многие, изучившие Lisp, отмечают, что полученное знание помогает им лучше писать программы даже на других языках, в том числе на C++.

Многих к изучению и использованию лиспа вдохновила статья Пола Грэма «Побеждая посредственность» — http://www.paulgraham.com/avg.html — с русским переводом которой можно ознакомится на http://www.nestor.minsk.by/sr/2003/07/30710.html, в которой описывается, как фактически именно лисп стал «секретным оружием» успешного стартапа Viaweb, позднее приобретённого Yahoo.

Какие существуют разновидности Lisp?

Со времени первоначального Lisp, созданного в 1958 году Джоном Маккарти (John McCarthy), прошло уже много лет и сейчас имеется несколько диалектов и родственных языков. Среди наиболее важных диалектов можно назвать Common Lisp и Scheme, первый является ANSI стандартом языка Lisp номер X3.226-1994, постепенно развившимся из первоначального варианта языка, а Scheme — диалект лиспа, созданный Гаем Стилом и Джеральдом Дж. Сассманом (Guy L. Steele и Gerald Jay Sussman), на который тоже существует стандарт R6RS, хотя наиболее распространённые реализации используют до сих пор его предыдущую версию R5RS

Также распространены диалекты elisp — Emacs Lisp, используемый в редакторах GNU Emacs и XEmacs и AutoLisp, используемый в CAD-программе AutoCAD, выпускаемой Autodesk. По сравнению со стандартами, elisp и AutoLisp имеют серьёзные ограничения. В последнее время получил распространение диалект Clojure, позволяющий создавать приложения для платформы Java. Имеется и немало других диалектов и разновидностей языка, в том числе и по той причине, что даже разные трансляторы Common Lisp различаются в некоторых деталях реализации.

Какие имеются компиляторы/интерпретаторы Lisp?

Реализующие Common Lisp

Подробное сравнение нескольких реализаций Common Lisp (англ.)

Интерпретаторов и компиляторов Lisp и Scheme очень много большой список приведён на сайте Пола Грэма, здесь же приведён список, по мнению составителей FAQ, наиболее универсальных, популярных и доступных.

Свободные

Проприетарные

Однозначно рекомендовать тот или иной компилятор/интерпретатор сложно, многое зависит от конкретных задач, но всё-таки, среди свободных реализаций стоит отметить CLISP и SBCL, CLISP более широко распространен и немного удобнее в работе, особенно в ходе обучения, SBCL часто быстрее CLISP и реализует ряд функциональных парадигм, не вошедших в стандарт Common Lisp, но чрезвычайно полезных, например, хвостовую (концевую) рекурсию. CMUCL более медленно развивается, но существует ряд полезных библиотек, ориентированных на него. GCL применяется, в частности, в системе компьютерной алгебры Axiom.

Реализующие Scheme

Свободные

Поддерживающие R7RS
  • Racket — помимо поддержки R5RS и R6RS реализует собственный диалект Lisp'а;
  • sagittarius;
  • chibi-scheme — небольшая встраиваемая реализация;
  • Gauche — есть начальная поддержка R7RS.
  • Ol — чисто функциональный диалект со своей собственной виртуальной машиной.
Поддерживающие R6RS
Поддерживающие R5RS

Примечание: большая часть этих реализаций не собирается поддерживать R6RS никогда. Подробности можно узнать на http://scheme-punks.org/wiki/index.php?title=Main_Page.

В известный графический редактор GIMP встроен скриптовый язык Script-Fu, являющийся усечённым вариантом Scheme, базирующемся на интерпретаторе TinyScheme. Еще одной интересной встраиваемой реализацией Scheme является s7.

Проприетарные

Нужна документация по Lisp

На русском языке

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

Хювёнен Э., Сеппянен Й. Мир Лиспа. В 2-х томах — М.: Мир, 1990 г.

Более-менее известная книга финских авторов, существует в электронном виде в электронных библиотеках.

Абельсон Харольд, Сассман Джеральд при участии Джули Сассман, Структура и интерпретация компьютерных программ — М.: Добросвет, "КДУ", 2006 г.

Эта, де-факто культовая книга, собственно говоря, не о языке Scheme, а учебник по программированию, является переводом вводного курса по компьютерным наукам (Computer Science). Язык Scheme в ней служит языком на примере которого происходит обучение парадигмам и методам программирования

Книга свободно доступна на английском языке: sicp также по ключевому слову sicp можно найти в интернете её перевод на русский язык.

Имеется блог, посвящённый изучению этой книги и решению задач из неё: sicp.sergeykhenkin.com

В. Водолазкий, Первые шаги в GNU Common Lisp

http://www.cardarmy.ru/proekt/lisp/art1.htm

Цикл статей о Lisp, опубликованный на сайте В. Водолазкого. Для примеров используется GCL.

Перевод на русский Practical Common Lisp

Английский — http://lisper.ru/pcl/

работа еще в процессе, можно регистрироваться и переводить/вычитывать

Курс лекций функционального программирования. Морозов М. Н.

http://www.marstu.mari.ru:8101/mmlab/home/lisp/title.htm

Выучите Scheme за считанные дни

https://bitbucket.org/muspellsson/scheme-books-ru

Работа в процессе по переводу книги Teach Yourself Scheme in Fixnum Days

В поисках книг и статей по Lisp на русском языке можно обнаружить заметное количество документов по AutoLisp'у — диалекту языка Lisp, применяемом для пользовательского программирования конструкторских задач в AutoCAD. Их сложно рекомендовать для полноценного обучения Lisp'у по причине ограниченности самого AutoLisp'а, его заточенности под AutoCAD, следствием чего является ограниченность в использовании возможностей языка у авторов этих книг. В частности, такая фундаментальная возможность Lisp, как метапрограммирование практически выпадает в AutoLisp'е.

На английском языке

Основная документация, необходимая для серьёзного изучения Lisp'а имеется только на английском языке.

  1. Common Lisp HyperSpec (CLHS) — свободно доступный электронный справочник по Common Lisp. Входит в состав некоторых дистрибутивов Linux.
  2. Guy L. Steele, Common Lisp the Language, 2nd Edition — книга, описывающая Common Lisp во время процесса стандартизации, была выпущена до ратификации окончательного варианта ANSI-стандарта и между ними имеются некоторые отличия. Как и HyperSpec входит в состав некоторых дистрибутивов Linux. Продаётся бумажный вариант книги.
  3. публикации Erann Gat, в частности стоит обратить внимание на Erann Gat, The Complete Idiot’s Guide to Common Lisp Packages — статья учит как использовать пакеты (модули) в Lisp'е.
  4. Paul Graham, On Lisp — Prentice Hall, 1993. Можно свободно скачать электронный вариант с сайта автора On Lisp
  5. Paul Graham, ANSI Common Lisp — Prentice Hall, 1995. В отличие от книги On Lisp того же автора, свободно распространяемой версии не существует.
  6. Paul Graham, The Roots of Lisp, 2002 — в этой статье рассматривается минимальный базис из операторов на которых можно построить Lisp. Даётся рекурсивное определение функции eval, фактически определяя этим интерпретатор Lisp.
  7. Peter Seibel, Practical Common Lisp — APRESS, 2005. Можно свободно скачать электронный вариант Practical Common Lisp. Имеется сайт для работы над переводом этой книги.
  8. Common Lisp Quick Reference — короткая справка (шпаргалка) по Common Lisp.

Начать изучение можно рекомендовать с книги Practical Common Lisp. В состав архива от CLISP в подкаталоге doc лежат два файла: Lisp-tutorial.txt и CLOS-guide.txt являющиеся соответственно введением в Lisp и в его ООП-расширение CLOS. Их вполне можно использовать для начального знакомства с языком и в качестве справки, но не стоит по ним систематически учиться.

Для более глубокого понимания математических основ Lisp следует обратить внимание на лямбда исчисление Чёрча.

Головешкин В. А., Ульянов М. В. Теория рекурсии для программистов — М.ФИЗМАТЛИТ, 2006 г. В значительной мере эта книга основана как раз на лямбда исчислении Чёрча.

Какие существуют среды разработки для Lisp?

Проприетарные AllegroLisp и LispWorks поставляются со своими средами разработки.

Свободные среды:

  1. Emacs + дополнение paredit-el. Поддерживает баланс скобок, ряд высокоуровневых действий над S-выражениями.

Ориентированные на Common Lisp

  1. Emacs + расширение Slime;
  2. Emacs + пакет ilisp (устаревшее, но рабочее);
  3. Eclipse + плагин Dandelion-ecl (Dandelion);
  4. Eclipse + плагин CUSP.

Ориентированные на Scheme

  1. Emacs — Статья про использование Emacs для программирования на Scheme:
    1. Emacs + cmuscheme;
    2. Emacs + расширение Quack;
    3. Emacs + расширение Slime48 в качестве бэкенда к Slime. Работает только с Scheme48 1.3.
  2. DrScheme;
  3. Vim + плагин limp.

Установил Emacs и Slime, почему не работает?

Slime телепатией не обладает и ему надо как-то указать используемый компилятор Lisp, например, записав в файле настроек ~/.emacs следующее

(setq inferior-lisp-program "/usr/bin/sbcl")

После вызова Emacs, по команде M-x slime произойдёт запуск сервера cl-swank, использующего в данном случае SBCL.

Для более тонкой настройки надо прочитать документацию по slime, идущую с ним в комплекте. Скорее всего она находится в /usr/share/doc/slime

Где мне найти библиотеки и программы для Lisp?