Cellar Door

28 июня 2005

О языке Lisp. Часть 1

Пару дней назад началось мое знакомство с языком функционального программирования Lisp, вернее Common Lisp, и это отличный опыт. "The programmable programming language", язык о котором пишут "the best programming language ever". Говорят, "люди его или фанатично любят, или не менее фанатично ненавидят" (А. Зубинский). Так что здесь попытаюсь подытожить свои скромные опыты с данным языком. Впрочем язык и без меня достаточно распостранен, особенно в Unix-среде с ее Emacs Lisp, так что этот пост будет чем-то вроде наставления для начинающих.
В поисках описания языка можно обратиться к Wikipedia - Lisp, Common Lisp, Scheme (Scheme - один из диалектов Lisp. А интерпретатор guile, который присутствует в большинстве дистрибутивов Linux, реализует именно язык Scheme).
Начинают подготовку среды для работы Lisp с выбора реализации (интерепретатора), каковые отличаются степенью соответствия ANSI-стандарту и наличием дополнительных фич. Основные варианты - это CMUCL (Carnegie Mellon University Common Lisp), SBCL (Steel Bank Common Lisp), CLISP, GCL (GNU Common Lisp) и ECL. Под Mac есть OpenMCL. Для изучения языка любая из этих реализаций отлично подойдет, и все они хорошо документированы: GCL и ECL имеют руководства в info-формате, подробная документация по CMUCL есть на официальном сайте, помочь в её выборе призвана EncyCMUCLopedia. CLISP и SBCL также прекрасно документированы, еще стоит поставить clisp-hyperspec (/usr/ports/devel/clisp-hyperspec), reference-мануал, производный от ANSI-стандарта. Вторым компонентом среды станет SLIME (usr/ports/editors/slime) - Superior Lisp Interaction Mode for Emacs. Чтоб подключить его к Emacs'у, добавляем следующие строки в ~/.emacs:
(add-to-list 'load-path "/where/you/put/slime")
(require 'slime)
(setq inferior-lisp-program "yourlisp")
(add-hook 'lisp-mode-hook (lambda () (slime-mode t)
(local-set-key "\r" 'newline-and-indent)
(setq lisp-indent-function 'common-lisp-indent-function)
(setq indent-tabs-mode nil)))

Не забудьте подставить свой "/where/you/put/slime" (у меня это "/usr/local/share/emacs/21.3/site-lisp/slime/") и заменить "yourlisp" на команду запуска выбранного интерпретатора. Затем запускаем Emacs, M-x, команда slime.