Сокращения
Символ сокращения, иногда известный как «переименованные символы», — это символьные формы, встречающиеся в исходном коде 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