~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ B1184C7F6652585A6F2DA7A983796A6A__1718371680 ✰
Заголовок документа оригинал.:
✰ Emacs Lisp - Wikipedia ✰
Заголовок документа перевод.:
✰ Emacs Lisp — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Emacs_Lisp ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/b1/6a/b1184c7f6652585a6f2da7a983796a6a.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/b1/6a/b1184c7f6652585a6f2da7a983796a6a__translat.html ✰
Дата и время сохранения документа:
✰ 16.06.2024 09:52:40 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 14 June 2024, at 16:28 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Emacs Lisp — Википедия Jump to content

Эмакс Лисп

Из Википедии, бесплатной энциклопедии
Эмакс Лисп
Эмакс логотип
Парадигма Функциональный , мета , рефлексивный
Семья Лисп
Разработано Ричард Столлман ,
Гай Л. Стил-младший
Разработчик Проект GNU
Впервые появился 1985 год ; 39 лет назад ( 1985 )
Стабильная версия
29.1 / 30 июля 2023 г .; 10 месяцев назад ( 30.07.2023 )
Дисциплина набора текста Динамичный , сильный
Объем Динамический, опционально лексический
Платформа Эмакс
ТЫ Кросс-платформенный
Лицензия лицензия GPLv3
Расширения имен файлов .el, .elc, .eln
Веб-сайт www .gnu .org /программное обеспечение /emacs
Под влиянием
Общий Лисп , Маклисп

Emacs Lisp — это Лиспа, диалект созданный для Emacs . Он используется для реализации большей части функций редактирования, встроенных в Emacs, остальная часть написана на C Lisp , как и интерпретатор .

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

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

Emacs Lisp также называют Elisp , хотя существуют и более старые, не связанные между собой диалекты Lisp с таким названием. [3] [4]

По сравнению с другими диалектами Лиспа [ править ]

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

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

1958 1960 1965 1970 1975 1980 1985 1990 1995 2000 2005 2010 2015 2020
ЛИСП 1, 1.5, ЛИСП 2 (заброшенный)
 Маклисп
 Интерлисп
 леев
 Лисп-машина Лисп
 Схема Р5РС Р6РС R7RS маленький
 НОЛЬ
 ЗИЛ (язык реализации Zork)
 Франц Лисп
 Общий Лисп стандарт ANSI
 Лисп
 Схема СО
 XLISP
 Т
 На схеме
 Эмакс Лисп
 АвтоЛИСП
 ПикоЛисп
 Гамбит
 EuLisp
 ИСЛИСП
 ОпенЛисп
 Схема PLT  Ракетка
 новыйЛИСП
 GNU Коварство
 Визуальный ЛИСП
 Кложур
 Дуга
 ЛФЭ
 Он
 Хиалисп

Пример [ править ]

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

Ниже следует простой пример расширения Emacs, написанного на Emacs Lisp. В Emacs область редактирования можно разделить на отдельные области, называемые окнами , каждая из которых отображает отдельный буфер . Буфер — это область текста, загруженная в память Emacs (возможно, из файла), которую можно сохранить в текстовый документ.

Пользователи могут нажать кнопку по умолчанию C-x 2 привязка клавиш для открытия нового окна. Это запускает функцию Emacs Lisp. split-window-below. Обычно, когда появляется новое окно, оно отображает тот же буфер, что и предыдущее. Предположим, мы хотим, чтобы он отображал следующий доступный буфер. Чтобы сделать это, пользователь пишет следующий код Emacs Lisp либо в существующем исходном файле Emacs Lisp, либо в пустом буфере Emacs:

(  defun   my-split-window-func   () 
   (  интерактивный  ) 
   (  split-window-ниже  ) 
   (  set-window-buffer   (  следующее окно  )   (  other-buffer  ))) 

 (  global-set-key   (  kbd   "Cx 2  ) "  )   #'  my-split-window-func  ) 

Первое заявление, (defun ...), определяет новую функцию, my-split-window-func, который вызывает split-window-below(старая функция разделения окон), затем сообщает новому окну отобразить другой (новый) буфер. Второе заявление, (global-set-key ...) повторно привязывает последовательность клавиш «Cx 2» к новой функции.

Это также можно написать с помощью функции под названием «совет» , которая позволяет пользователю создавать оболочки вокруг существующих функций вместо определения своих собственных. Преимущество этого метода состоит в том, что он не требует изменения привязок клавиш и работает везде, где вызывается исходная функция, а также его проще писать, но недостатком является усложнение отладки. По этой причине советы не разрешены в исходном коде GNU Emacs. [7] но если пользователь пожелает, функция совета может быть использована в его коде для повторной реализации приведенного выше кода следующим образом:

(  defadvice   Split-Window-ниже 
   (  после   моего-окна-разделения-совета   первой   ()   активации  ) 
   (  set-window-buffer   (  следующее-окно  )   (  другой-буфер  ))) 

Это поручает split-window-belowдля выполнения предоставленного пользователем кода при каждом его вызове после выполнения остальной части функции. Также можно указать, что совет будет выполняться перед исходной функцией, вокруг нее (буквально оборачивая оригинал) или условно выполнять исходную функцию на основе результатов совета.

Emacs 24.4 заменяет [8] этот defadvice механизм с advice-add, который считается более гибким и простым. [9] Приведенный выше совет можно было бы повторно реализовать с использованием новой системы следующим образом:

(  defun   переключиться на следующее-окно-в-разделении   () 
   (  set-window-buffer   (  следующее-окно  )   (  другой-буфер  ))) 

 (  совет-добавить   'split-window-ниже   :before   #'  переключиться на -следующее-окно-в-разделении  ) 

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

Исходный код [ править ]

Код Emacs Lisp хранится в файловых системах в виде простых текстовых файлов, по соглашению с суффиксом имени файла " .el". Файл инициализации пользователя является исключением и часто отображается как " .emacs", несмотря на то, что он оценивается как любой код Emacs Lisp. С середины 1990-х годов Emacs также загружает ~/.emacs.el и ~/.emacs.d/init.el. Кроме того, пользователи могут указать любой файл для загрузки в качестве файла конфигурации в командной строке или явно указать, что файл конфигурации не загружается. Когда файлы загружаются, компонент интерпретатора программы Emacs считывает и анализирует функции и переменные, сохраняя их в памяти. Затем они доступны для других функций редактирования и пользовательских команд. Функции и переменные можно свободно изменять и переопределять без перезапуска редактора или перезагрузки файла конфигурации.

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

Разработчики Emacs пишут определенные функции на C. Это примитивы , также называемые встроенными функциями или subrs . Хотя примитивы можно вызывать из кода Lisp, их можно изменить только путем редактирования исходных файлов C и перекомпиляции. В GNU Emacs примитивы недоступны в виде внешних библиотек; они являются частью исполняемого файла Emacs. В XEmacs операционной системы возможна загрузка таких примитивов во время выполнения, используя поддержку динамического связывания . Функции могут быть написаны как примитивы, потому что им нужен доступ к внешним данным и библиотекам, которые иначе не доступны в Emacs Lisp, или потому, что они вызываются достаточно часто, чтобы сравнительная скорость C по сравнению с Emacs Lisp имела важное значение.

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

Байт-код [ править ]

Байт-компиляция может ускорить выполнение кода Emacs Lisp. Emacs содержит компилятор , который может транслировать исходные файлы Emacs Lisp в специальное представление, называемое байт-кодом . Файлы байт-кода Emacs Lisp имеют суффикс имени файла " .elc«. По сравнению с исходными файлами файлы байт-кода загружаются и работают быстрее, занимают меньше места на диске и используют меньше памяти при загрузке.

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

Языковые особенности [ править ]

Примечательно, что пакет «cl-lib» реализует довольно большое подмножество Common Lisp . Этот пакет заменяет более ранний пакет «cl», который перезаписывал существующие определения функций Emacs Lisp определениями, более похожими на те, которые находятся в Common Lisp. Пакет «cl-lib», с другой стороны, более точно следует рекомендациям по стилю Emacs Lisp и ставит перед каждой функцией и макросом префикс «cl-» (например, cl-defun, который не конфликтует с именем встроенного defun), избегая неожиданных изменений в поведении, которые могут произойти при загрузке пакета «cl».

Emacs Lisp (в отличие от некоторых других реализаций Lisp) не выполняет оптимизацию хвостовых вызовов . [10] Без этого хвостовая рекурсия может в конечном итоге привести к переполнению стека .

Библиотека apel помогает писать переносимый код Emacs Lisp с помощью моста платформы Polysylabi.

Emacs Lisp — это Lisp-2, подобный Common Lisp, что означает, что у него есть пространство имен функций, отдельное от пространства имен, которое он использует для других переменных. [11]

От динамического к лексическому обзору [ править ]

Как и MacLisp, Emacs Lisp использует динамическую область видимости , предлагая в качестве опции статическую (или лексическую), начиная с версии 24. [12] Его можно активировать, установив локальную переменную файла. lexical-binding. [13] [14] До того, как эта опция была добавлена, можно было использовать lexical-let макрос из пакета «cl» (ныне устаревшего) для обеспечения эффективной лексической области видимости. [15]

При динамической области видимости, если программист объявляет переменную в области действия функции, она доступна подпрограммам, вызываемым из этой функции. Первоначально это было задумано как оптимизация ; лексическое определение все еще было редкостью и имело неопределенную эффективность. По воспоминаниям ученого-компьютерщика Олина Шиверса: «Я спросил RMS, когда он реализовал emacs lisp, почему он имеет динамическую область видимости, и его точный ответ заключался в том, что лексическая область видимости слишком неэффективна». [16] Динамическая область видимости также была предназначена для обеспечения большей гибкости пользовательской настройки. Однако динамическая область видимости имеет ряд недостатков. Во-первых, это может легко привести к ошибкам в больших программах из-за непреднамеренного взаимодействия переменных в разных функциях. Во-вторых, доступ к переменным при динамической области видимости обычно происходит медленнее, чем при лексической области видимости. [17]

См. также [ править ]

Ссылки [ править ]

  1. ^ «Байт-компиляция Emacs Lisp» . Руководство по GNU Emacs . Проверено 14 июня 2024 г. {{cite web}}: CS1 maint: статус URL ( ссылка )
  2. ^ «Компиляция Emacs Lisp в собственный код» . Руководство по GNU Emacs . Проверено 14 июня 2024 г. {{cite web}}: CS1 maint: статус URL ( ссылка )
  3. ^ «ХЕДРИК в РУТГЕРСЕ (руководитель DEC-20/Dir LCSR Comp Facility» (1981-12-18). « Информация о реализации Common Lisp» » . Письмо «rpg в SU-AI, jonl в MIT-AI». Архивировано . из оригинала 20 сентября 2016 г. Проверено 28 июля 2019 г. Сейчас у нас есть некоторый опыт реализации Lisp, поскольку Elisp (расширенная реализация Rutgers/UCI Lisp) по существу завершена. {{cite press release}}: CS1 maint: числовые имена: список авторов ( ссылка )
  4. ^ «Реклама CCA EMACS». Обзор Юникс . Декабрь 1984 г. с. 16. CCA EMACS и Elisp являются товарными знаками CCA Uniworks, Inc.
  5. ^ «GNU Emacs Lisp во многом вдохновлен Maclisp и немного Common Lisp. Если вы знаете Common Lisp, вы заметите много общего. Однако многие функции Common Lisp были опущены или упрощены, чтобы уменьшить требования к памяти. GNU Emacs Иногда упрощения настолько радикальны, что пользователь Common Lisp может прийти в замешательство. Время от времени мы будем указывать, чем GNU Emacs Lisp отличается от Common Lisp». – из раздела «История» «Введения» в руководство по Emacs Lisp, начиная с Emacs 21.
  6. ^ «Итак, разработка этой операционной системы, операционной системы GNU, побудила меня написать GNU Emacs. При этом я стремился создать абсолютно минимальную возможную реализацию Lisp. Размер программ вызывал огромную озабоченность. В те времена, в 1985 году, были люди, у которых были машины с объемом памяти в один мегабайт и без виртуальной памяти. Они хотели иметь возможность использовать GNU Emacs. Это означало, что мне приходилось делать программу как можно меньше». – из «Мой опыт работы с Lisp и разработка GNU Emacs»
  7. ^ «Re: [Emacs-diffs] /srv/bzr/emacs/trunk r111086: gmm-utils.el (gmm-flet» . Lists.gnu.org. 05 декабря 2012 г. Проверено 18 августа 2013 г. .
  8. ^ «ВЕСТИ.24.4» .
  9. ^ «Портирование старых советов» .
  10. ^ «Приложение C. Портирование Common Lisp» . Gnu.org . Проверено 28 октября 2019 г. Программистам Lisp следует отметить, что текущий компилятор Emacs Lisp не оптимизирует хвостовую рекурсию.
  11. ^ «Группы Google» . groups.google.com .
  12. ^ «Выпущен Emacs 24.1» . Lists.gnu.org . Проверено 18 августа 2013 г.
  13. ^ «Лексическая привязка» . Lists.gnu.org. 01.04.2011 . Проверено 18 августа 2013 г.
  14. ^ «Динамическая привязка против лексической привязки» . ЭмаксВики. 17 мая 2013 г. Проверено 18 августа 2013 г.
  15. ^ «Устаревшая лексическая привязка» . Эмуляция GNU Emacs Common Lisp . ГНУ Пресс . Проверено 27 мая 2021 г.
  16. ^ «Т» . People.csail.mit.edu . Проверено 18 августа 2013 г.
  17. ^ Фезерстон, Сэм; Винклер, Сюзанна (2 июня 2009 г.). Процесс . Вальтер де Грюйтер. ISBN  978-3-11-021614-1 .

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: B1184C7F6652585A6F2DA7A983796A6A__1718371680
URL1:https://en.wikipedia.org/wiki/Emacs_Lisp
Заголовок, (Title) документа по адресу, URL1:
Emacs Lisp - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)