Использование строкового объекта в качестве хеш-ключа в Common Lisp - PullRequest
20 голосов
/ 11 сентября 2009

Я пытаюсь создать тип словаря - то есть хеш-таблицу со строкой в ​​качестве ключа. Это возможно или мудро в Лиспе?

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

> (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

1 Ответ

34 голосов
/ 11 сентября 2009

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

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

(make-hash-table :test 'equal)

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

...