Создание хеш-таблиц
Основной функцией для создания хеш-таблицы является 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