Создание хеш-таблиц
Основная функция для создания хеш-таблицы — 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-
Здесь указывается предполагаемое количество ассоциаций, которые вы планируете хранить в хеш-таблице. Если вы знаете примерное количество, можно немного повысить эффективность, указав его таким образом, однако, поскольку память хеш-таблицы управляется автоматически, выигрыш в скорости редко бывает значительным.
Хеш-таблицу также можно создать с помощью печатного представления хеш-таблиц. Считыватель Lisp может прочитать это печатное представление при условии, что каждый элемент указанной хеш-таблицы имеет допустимый синтаксис чтения (см. Печатное представление и синтаксис чтения). Например, следующая запись задаёт хеш-таблицу, содержащую ключи key1 и key2 (оба символа), которым соответствуют val1 (символ) и 300 (число) соответственно.
#s(hash-table data (key1 val1 key2 300))
Однако обратите внимание: при использовании этого в коде Emacs Lisp не определено, создаёт ли это новую хеш-таблицу. Если вам нужно создать новую хеш-таблицу, всегда используйте make-hash-table (см. Самовычисляемые формы).
Печатное представление хеш-таблицы состоит из ‘#s’, за которым следует список, начинающийся с ‘hash-table’. Остальная часть списка должна состоять из нуля или более пар «свойство—значение», задающих свойства хеш-таблицы и её начальное содержимое. Свойства и значения считываются буквально. Допустимые имена свойств: test, weakness и data. Свойство data должно содержать список пар «ключ—значение» для начального содержимого; остальные свойства имеют те же значения, что и соответствующие ключевые слова make-hash-table (:test и :weakness), описанные выше.
Обратите внимание, что нельзя задать хеш-таблицу, начальное содержимое которой включает объекты без синтаксиса чтения, например буферы и фреймы. Такие объекты можно добавить в хеш-таблицу после её создания.
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/Creating-Hash.html