Spec-Zone.ru › Elisp

Сокращения

Символ сокращения, иногда известный как «переименованные символы», — это символьные формы, встречающиеся в исходном коде Lisp. Они такие же, как и обычные символьные формы, за исключением того, что при их встрече читателем Lisp создаются символы с другим, обычно более длинным, именем вывода (см. Компоненты символов).

Полезно рассматривать сокращения как сокращения полных имен целевых символов. Несмотря на это, не следует путать сокращения с системой сокращений, см. Сокращения.

Сокращения облегчают работу с этикетом именования в Emacs Lisp. Поскольку все символы хранятся в одном массиве obarray (см. Создание символов), программисты обычно добавляют префикс к имени каждого символа, соответствующий имени библиотеки, откуда он происходит. Например, функции text-property-search-forward и text-property-search-backward оба принадлежат библиотеке text-property-search.el (см. Загрузка). Правильным добавлением префикса к именам символов эффективно предотвращаются конфликты между одинаково названными символами, которые принадлежат разным библиотекам и, следовательно, выполняют разные действия. Однако эта практика часто приводит к очень длинным именам символов, которые неудобно набирать и читать со временем. Сокращения решают эти проблемы чистым способом.

Переменная: read-symbol-shorthands

Значение этой переменной — alist, элементы которого имеют вид (shorthand-prefix . longhand-prefix). Каждый элемент указывает читателю Lisp интерпретировать каждую форму символа, начинающуюся с shorthand-prefix, как если бы она начиналась с longhand-prefix вместо этого.

Эта переменная может быть установлена только в локальных переменных файла (см. Локальные переменные в файлах в Руководстве GNU Emacs).

Вот пример использования сокращений в гипотетической библиотеке для работы с строками some-nice-string-utils.el.

(defun some-nice-string-utils-split (separator s &optional omit-nulls)
  "A match-data saving variant of `split-string'."
  (save-match-data (split-string s separator omit-nulls)))

(defun some-nice-string-utils-lines (s)
  "Split string S at newline characters into a list of strings."
  (some-nice-string-utils-split "\\(\r\n\\|[\n\r]\\)" s))

Как видно, чтение или разработка этого кода довольно утомительно из-за таких длинных имен символов для ввода. Мы можем использовать сокращения, чтобы облегчить эту задачу.

(defun snu-split (separator s &optional omit-nulls)
  "A match-data saving variation on `split-string'."
  (save-match-data (split-string s separator omit-nulls)))

(defun snu-lines (s)
  "Split string S into a list of strings on newline characters."
  (snu-split "\\(\r\n\\|[\n\r]\\)" s))

;; Local Variables:
;; read-symbol-shorthands: (("snu-" . "some-nice-string-utils-"))
;; End:

Несмотря на то, что два фрагмента выглядят по-разному, они почти идентичны после обработки читателем Lisp. Оба приведут к интернированию одних и тех же символов (см. Создание символов). Таким образом, загрузка или компиляция в байт-код любого из этих двух файлов даст одинаковый результат. Сокращения snu-split и snu-lines , используемые во второй версии, не интернированы в obarray. Это легко увидеть, переместив точку в место, где используются сокращения, и ожидая, пока ElDoc (см. Локальные переменные в файлах в Руководстве GNU Emacs) не укажет истинное полное имя символа под точкой в области отображения.

Поскольку read-symbol-shorthands является локальной переменной файла, возможно, что несколько библиотек, зависящих от some-nice-string-utils-lines.el, ссылаются на одни и те же символы с разными сокращениями или вообще без них. В следующем примере библиотека my-tricks.el ссылается на символ some-nice-string-utils-lines с префиксом sns- вместо префикса snu-.

(defun t-reverse-lines (s) (string-join (reverse (sns-lines s)) "\n")

;; Local Variables:
;; read-symbol-shorthands: (("t-" . "my-tricks-")
;;                          ("sns-" . "some-nice-string-utils-"))
;; End:

Исключения

Существует два исключения из правил преобразования сокращений:

  • Формы символов, состоящие целиком из символов в классе компонентов символов Emacs Lisp (см. Таблица классов синтаксиса) не преобразуются. Например, возможно использовать - или /= в качестве префиксов сокращений, но это не будет затенять арифметические функции с такими же именами.
  • Формы символов, имена которых начинаются с '#_', не преобразуются.

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Shorthands.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API