Лисп Emacs


Emacs Lisp — это диалект языка программирования Lisp, используемый Emacs в качестве языка сценариев ( семейство текстовых редакторов , чаще всего связанное с GNU Emacs и XEmacs ). Он используется для реализации большей части функций редактирования, встроенных в Emacs, остальные написаны на C , как и интерпретатор Lisp . Emacs Lisp также называется Elisp , хотя существует также более старый, не связанный с ним диалект Lisp с таким названием. [1]

Пользователи Emacs обычно пишут код Emacs Lisp для настройки и расширения Emacs. Другие опции включают функцию Customize , которая была в GNU Emacs с версии 20. Сама по себе написанная на Emacs Lisp, Customize предоставляет набор страниц настроек , позволяющих пользователю устанавливать опции и предварительно просматривать их эффект в работающем сеансе Emacs. Когда пользователь сохраняет свои изменения, Customize просто записывает необходимый код Emacs Lisp в пользовательский файл конфигурации , который может быть установлен в специальный файл, который использует только Customize, чтобы избежать возможности изменения собственного файла пользователя.

Emacs Lisp также может функционировать как язык сценариев , подобно оболочке Unix Bourne или Perl , вызывая Emacs в пакетном режиме . Таким образом, его можно вызывать из командной строки или через исполняемый файл, а его функции редактирования, такие как буферы и команды перемещения, доступны программе так же, как и в обычном режиме. Пользовательский интерфейс не отображается, когда Emacs запускается в пакетном режиме; он просто выполняет переданный сценарий и завершает работу, отображая все выходные данные сценария.

Emacs Lisp наиболее тесно связан с Maclisp , с некоторым более поздним влиянием Common Lisp . [2] Он поддерживает императивные и функциональные методы программирования. Ричард Столлман выбрал Lisp в качестве языка расширения для своего переписывания Emacs (исходный текстовый редактор и корректор (TECO) использовался в качестве языка расширения) из-за его мощных функций, включая способность обрабатывать функции как данные. Хотя стандарт Common Lisp еще не был сформулирован, Scheme существовал в то время, когда Столлман переписывал Gosling Emacs .в GNU Emacs. Он решил не использовать его из-за его сравнительно низкой производительности на рабочих станциях (в отличие от мини -компьютеров , которые были традиционным домом для Emacs), и он хотел разработать диалект, который, по его мнению, будет легче оптимизировать. [3]

Диалект Лиспа, используемый в Emacs, существенно отличается от более современных диалектов Common Lisp и Scheme, используемых для программирования приложений. Отличительной чертой Emacs Lisp является использование по умолчанию динамической, а не лексической области видимости . То есть функция может ссылаться на локальные переменные в области, из которой она вызывается, но не в той области, в которой она была определена. В последнее время предпринимались постоянные попытки обновить код для использования лексической области видимости по причинам, изложенным ниже.

Чтобы понять логику Emacs Lisp, важно помнить, что упор делается на предоставление структур данных и функций, специфичных для создания универсального текстового редактора, а не на реализацию языка программирования общего назначения. Например, Emacs Lisp не может легко прочитать файл построчно — весь файл должен быть прочитан в буфер Emacs. Однако Emacs Lisp предоставляет множество возможностей для навигации и изменения буферного текста на уровне предложения, абзаца или более высокого синтаксического уровня, как это определено режимами.