6.6 Символьные-таблицы

Символьная-таблица очень похожа на вектор, за исключением того, что она индексируется кодами символов. Любой допустимый код символа без модификаторов может использоваться как индекс в символьной-таблице. Вы можете обращаться к элементам символьной-таблицы с помощью aref и aset, как и с любым массивом. Кроме того, символьная-таблица может иметь дополнительные слоты для хранения дополнительных данных, не связанных с конкретными кодами символов. Как и векторы, символьные-таблицы являются константами при вычислении и могут содержать элементы любого типа.

Каждая символьная-таблица имеет подтип — символ, который служит двум целям:

Символьная-таблица может иметь родителя — другую символьную-таблицу. Если она его имеет, то всякий раз, когда символьная-таблица задаёт nil для конкретного символа c, она наследует значение, заданное в родителе. Иными словами, (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

Эта функция устанавливает родителя char-table в new-parent.

Функция: 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)))