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

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

Хеш-таблицу также можно создать с помощью печатного представления хеш-таблиц. Считыватель 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

Spec-Zone.ru

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