Использование string object в качестве хэш-ключа в Common Lisp

StackOverflow https://stackoverflow.com/questions/1409069

Вопрос

Я пытаюсь создать хэш-таблицу типа "словарь", то есть хэш-таблицу со строкой в качестве ключа.Возможно ли это или разумно в Lisp?

Я заметил, что это работает так, как ожидалось:

> (setq table (make-hash-table))
#<HASH-TABLE :TEST EQL size 0/60 #x91AFA46>
> (setf (gethash 1 table) "one")
"one"
> (gethash 1 table)
"one"

Однако следующее не означает:

> (setq table (make-hash-table))
#<HASH-TABLE :TEST EQL size 0/60 #x91AFA0E>
> table
#<HASH-TABLE :TEST EQL size 0/60 #x91AFA0E>
> (setf (gethash "one" table) 1)
1
> (gethash "one" table)
NIL
NIL
Это было полезно?

Решение

Вам нужно создать хэш-таблицу, которая использует 'equal вместо if'eql.'eql не вычисляет две строки с одинаковым содержимым в 't, в то время как 'equal это делает.

Вот как вы это делаете:

(make-hash-table :test 'equal)

Как отметил skypher, вы также можете использовать 'equalp вместо этого, если хотите хеширование строк без учета регистра.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top