Spec-Zone.ru › Elisp

Сокращённые обозначения

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

Spec-Zone.ru

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