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

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

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