Сокращённые обозначения
Символы сокращённых обозначений, иногда называемые «переименованными символами», — это символьные формы, встречающиеся в исходном коде Lisp. Они похожи на обычные символьные формы, за исключением того, что при их чтении читатель Lisp создаёт символы с другим и обычно более длинным печатным именем (см. Компоненты символов).
Удобно рассматривать сокращённые обозначения как сокращения полных имён предполагаемых символов. Несмотря на это, не путайте сокращённые обозначения с системой Abbrev (см. Abbrev и раскрытие сокращений).
Сокращённые обозначения упрощают работу с соглашениями об именовании пространств имён в Emacs Lisp. Поскольку все символы хранятся в одном obarray (см. Создание символов и включение их в таблицу), программисты обычно добавляют к имени каждого символа префикс с названием библиотеки, в которой он определён. Например, функции text-property-search-forward и text-property-search-backward относятся к библиотеке text-property-search.el (см. Загрузка). Правильно добавляя префиксы к именам символов, можно эффективно предотвращать конфликты между символами с похожими именами, которые относятся к разным библиотекам и, следовательно, выполняют разные задачи. Однако из-за этой практики имена символов часто становятся очень длинными, и со временем их становится неудобно вводить и читать. Сокращённые обозначения позволяют легко решить эти проблемы.
- Переменная: read-symbol-shorthands
-
Значение этой переменной — список ассоциаций, элементы которого имеют вид
(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:
Обратите внимание: если в одном файле есть два сокращённых обозначения, одно из которых является префиксом другого, сначала будет проверяться более длинное обозначение. Это происходит независимо от порядка, в котором сокращённые обозначения указаны в разделе локальных переменных файла.
'(
t//foo ; reads to 'my-tricks--foo', not 'my-tricks-/foo'
t/foo ; reads to 'my-tricks-foo'
)
;; Local Variables:
;; read-symbol-shorthands: (("t/" . "my-tricks-")
;; ("t//" . "my-tricks--"))
;; End:
Исключения
Из правил преобразования сокращённых обозначений есть два исключения:
- Символьные формы, состоящие исключительно из символов набора ‘^*+-/<=>_|’, не преобразуются. Например, в качестве префиксов сокращённых обозначений можно использовать
-или/=, но это не приведёт к затенению арифметических функций с такими именами. - Символьные формы, имена которых начинаются с ‘#_’, не преобразуются.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Shorthands.html