Таблицы символов
Таблица символов во многом похожа на вектор, за исключением того, что индексация в ней выполняется по кодам символов. В качестве индекса таблицы символов можно использовать любой допустимый код символа без модификаторов. Доступ к элементам таблицы символов осуществляется с помощью aref и aset, как и для любого массива. Кроме того, таблица символов может содержать дополнительные слоты для хранения данных, не связанных с определёнными кодами символов. Подобно векторам, при вычислении таблицы символов считаются константами; они могут содержать элементы любого типа.
У каждой таблицы символов есть подтип — символ, который служит двум целям:
- Подтип позволяет легко определить назначение таблицы символов. Например, таблицы отображения — это таблицы символов с
display-tableв качестве подтипа, а таблицы синтаксиса — таблицы символов сsyntax-tableв качестве подтипа. Подтип можно запросить с помощью функцииchar-table-subtype, описанной ниже. -
Подтип определяет количество дополнительных слотов в таблице символов. Это количество задаётся свойством символа
char-table-extra-slots, относящимся к подтипу (см. Свойства символов); его значением должно быть целое число от 0 до 10. Если у подтипа нет такого свойства символа, в таблице символов нет дополнительных слотов.
У таблицы символов может быть родительская таблица — другая таблица символов. В этом случае, если для определённого символа c в таблице символов указано nil, она наследует значение, заданное в родительской таблице. Иными словами, (aref char-table c) возвращает значение из родительской таблицы char-table, если в самой таблице char-table указано nil.
У таблицы символов также может быть значение по умолчанию. В этом случае (aref char-table c) возвращает значение по умолчанию, если в таблице символов не указано никакое другое значение, отличное от nil.
- Функция: make-char-table subtype &optional init
-
Возвращает новую таблицу символов с подтипом subtype (символом). Каждый элемент инициализируется значением init, по умолчанию равным
nil. Изменить подтип таблицы символов после её создания нельзя.Аргумент для указания длины таблицы символов отсутствует, поскольку любая таблица символов позволяет использовать в качестве индекса любой допустимый код символа.
Если у subtype есть свойство символа
char-table-extra-slots, оно задаёт количество дополнительных слотов в таблице символов. Это значение должно быть целым числом от 0 до 10; в противном случаеmake-char-tableвызывает ошибку. Если у subtype нет свойства символаchar-table-extra-slots(см. Списки свойств), в таблице символов нет дополнительных слотов.
- Функция: char-table-p object
Эта функция возвращает
t, если object — таблица символов, иnilв противном случае.
- Функция: char-table-subtype char-table
Эта функция возвращает символ подтипа char-table.
Для доступа к значениям по умолчанию в таблице символов нет специальной функции. Для этого используйте char-table-range (см. ниже).
- Функция: char-table-parent char-table
Эта функция возвращает родительскую таблицу для char-table. Родительской таблицей всегда является либо
nil, либо другая таблица символов.
- Функция: set-char-table-parent char-table new-parent
Эта функция задаёт new-parent в качестве родительской таблицы для char-table.
- Функция: char-table-extra-slot char-table n
Эта функция возвращает содержимое дополнительного слота n (нумерация начинается с нуля) таблицы char-table. Количество дополнительных слотов в таблице символов определяется её подтипом.
- Функция: set-char-table-extra-slot char-table n value
Эта функция сохраняет значение value в дополнительном слоте n (нумерация начинается с нуля) таблицы char-table.
Таблица символов может задавать значение элемента для отдельного кода символа, а также значение для целого набора символов.
- Функция: char-table-range char-table range
-
Эта функция возвращает значение, заданное в таблице char-table для диапазона символов range. Возможны следующие варианты range:
nil-
Обозначает значение по умолчанию.
- char
-
Обозначает элемент для символа char (если char — допустимый код символа).
(from . to)Ячейка cons обозначает все символы включительного диапазона «[from..to]». В этом случае функция возвращает значение для символа, заданного параметром from.
- Функция: set-char-table-range char-table range value
-
Эта функция задаёт в таблице char-table значение для диапазона символов range. Возможны следующие варианты range:
nil-
Обозначает значение по умолчанию.
t-
Обозначает весь диапазон кодов символов.
- char
-
Обозначает элемент для символа char (если char — допустимый код символа).
(from . to)Ячейка cons обозначает все символы включительного диапазона «[from..to]».
- Функция: map-char-table function char-table
-
Эта функция вызывает функцию function для каждого элемента таблицы char-table, значение которого не равно
nil. Функция function вызывается с двумя аргументами: ключом и значением. Ключ может быть аргументом range функцииchar-table-range— допустимым символом или ячейкой cons(from . to), задающей диапазон символов с одинаковым значением. Значение — это то, что возвращает(char-table-range char-table key).В совокупности пары «ключ — значение», переданные функции function, описывают все значения, хранящиеся в таблице char-table.
Возвращаемое значение всегда равно
nil; чтобы вызовыmap-char-tableбыли полезны, функция function должна иметь побочные эффекты. Например, ниже показано, как просмотреть элементы таблицы синтаксиса:(let (accumulator) (map-char-table (lambda (key value) (setq accumulator (cons (list (if (consp key) (list (car key) (cdr key)) key) value) accumulator))) (syntax-table)) accumulator) ⇒ (((2597602 4194303) (2)) ((2597523 2597601) (3)) ... (65379 (5 . 65378)) (65378 (4 . 65379)) (65377 (1)) ... (12 (0)) (11 (3)) (10 (12)) (9 (0)) ((0 8) (3)))
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/Char_002dTables.html