Spec-Zone.ru › Elisp

Создание хеш-таблиц

Основной функцией для создания хеш-таблицы является make-hash-table.

Функция: make-hash-table &rest keyword-args

Эта функция создает новую хеш-таблицу в соответствии с указанными аргументами. Аргументы должны состоять из чередующихся ключевых слов (специальных символов, распознаваемых особо) и значений, соответствующих им.

Несколько ключевых слов имеют смысл в make-hash-table, но о двух из них вам действительно нужно знать :test и :weakness.

:test test

Это задает метод поиска ключа для этой хеш-таблицы. По умолчанию используется eql; eq и equal являются другими вариантами:

eql

Ключи, являющиеся числами, одинаковы, если они equal, то есть, если они равны по значению и оба являются целыми числами или оба являются числами с плавающей точкой; в противном случае два различных объекта никогда не являются одинаковыми.

eq

Любые два различных объекта Lisp различны как ключи.

equal

Два объекта Lisp одинаковы как ключи, если они равны в соответствии с equal.

Вы можете использовать define-hash-table-test (см. Определение хеша) для определения дополнительных возможностей для test.

:weakness weak

Слабость хеш-таблицы указывает, сохраняется ли присутствие ключа или значения в хеш-таблице от сборки мусора.

Значение weak должно быть одним из nil, key, value, key-or-value, key-and-value, или t, что является псевдонимом для key-and-value. Если weak равно key, то хеш-таблица не препятствует сбору мусора своих ключей (если они не ссылаются нигде больше); если определенный ключ будет собран, соответствующее ассоциация удаляется из хеш-таблицы.

Если weak равно value, то хеш-таблица не препятствует сбору мусора значений (если они не ссылаются нигде больше); если определенное значение будет собрано, соответствующая ассоциация удаляется из хеш-таблицы.

Если weak равно key-and-value или t, как ключ, так и значение должны быть живыми, чтобы сохранить ассоциацию. Таким образом, хеш-таблица не защищает ни ключи, ни значения от сборки мусора; если любой из них будет собран как мусор, это удалит ассоциацию.

Если weak равно key-or-value, либо ключ, либо значение могут сохранить ассоциацию. Таким образом, ассоциации удаляются из хеш-таблицы, когда и ключ, и значение будут собраны как мусор (если не для ссылок из слабых хеш-таблиц).

Значение по умолчанию для weak равно nil, поэтому все ключи и значения, на которые ссылается хеш-таблица, сохраняются от сборки мусора.

:size size

Это задает подсказку о том, сколько ассоциаций вы планируете хранить в хеш-таблице. Если вы знаете приблизительное число, вы можете сделать вещи немного эффективнее, указав его таким образом. Если вы укажете слишком маленький размер, хеш-таблица будет автоматически увеличиваться при необходимости, но это займет некоторое дополнительное время.

Размер по умолчанию составляет 65.

:rehash-size rehash-size

Когда вы добавляете ассоциацию в хеш-таблицу, и таблица заполнена, она увеличивается автоматически. Это значение указывает, как увеличить хеш-таблицу в этот момент.

Если rehash-size является целым числом, оно должно быть положительным, и хеш-таблица увеличивается, приблизительно добавляя столько к номинальному размеру. Если rehash-size является числом с плавающей точкой, оно должно быть больше 1, и хеш-таблица увеличивается, приблизительно умножая старый размер на это число.

Значение по умолчанию равно 1,5.

:rehash-threshold threshold

Это задает критерий, когда хеш-таблица считается полной (поэтому её нужно увеличить). Значение threshold должно быть положительным числом с плавающей точкой, не больше 1. Хеш-таблица считается полной, когда фактическое количество записей превышает номинальный размер, умноженный на приближение к этому значению. Значение по умолчанию для threshold равно 0,8125.

Вы также можете создать хеш-таблицу, используя печатное представление для хеш-таблиц. Чтец Lisp может прочитать это печатное представление, при условии, что каждый элемент в указанной хеш-таблице имеет допустимый синтаксис чтения (см. Печатное представление). Например, следующее задает хеш-таблицу, содержащую ключи key1 и key2 (оба символа), сопоставленные соответственно с val1 (символ) и 300 (число).

#s(hash-table size 30 data (key1 val1 key2 300))

Однако следует отметить, что при использовании этого в коде Emacs Lisp не определено, создается ли новая хеш-таблица или нет. Если вы хотите создать новую хеш-таблицу, вы всегда должны использовать make-hash-table (см. Самооцениваемые формы).

Печатное представление хеш-таблицы состоит из ‘#s’, за которым следует список, начинающийся с ‘hash-table’. Остальная часть списка должна состоять из нуля или более пар свойство-значение, определяющих свойства и начальное содержимое хеш-таблицы. Свойства и значения читаются буквально. Допустимыми именами свойств являются size, test, weakness, rehash-size, rehash-threshold, и data. Свойство data должно быть списком пар ключ-значение для начального содержимого; другие свойства имеют то же значение, что и соответствующие ключевые слова make-hash-table (:size, :test, и т.д.), описанные выше.

Обратите внимание, что вы не можете указать хеш-таблицу, чье начальное содержимое включает объекты, у которых нет синтаксиса чтения, например, буферы и фреймы. Такие объекты могут быть добавлены в хеш-таблицу после её создания.

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/Creating-Hash.html

Spec-Zone.ru

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