2009-09-11 6 views
19

J'essaie de créer un type "dictionnaire", c'est-à-dire une table de hachage avec une chaîne comme clé. Est-ce possible ou sage en Lisp?Utilisation d'un objet string en tant que clé de hachage dans Common Lisp

je remarquai que cela fonctionne comme prévu:

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

Cependant, ce qui suit n'a pas:

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

Répondre

31

Vous devez faire table de hachage qui utilise 'égale au lieu si' eql. 'eql n'évalue pas deux chaînes avec le même contenu à' t, tandis que 'equal' le fait.

Voici comment vous le faites:

(make-hash-table :test 'equal) 

Comme skypher noté, vous pouvez également utiliser « equalp à la place si vous voulez insensible à la casse hashing chaîne.

+3

Justicle, le CLHS a juste ceci à titre d'exemple. Si ce n'est pas évident, regarder la documentation peut aider: http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm –

+6

Utilisez EQUALP à la place si vous voulez un hachage de chaîne insensible à la casse. – skypher

+0

Merci les gens. J'avais vérifié les docs, mais je n'avais pas vraiment prêté suffisamment d'attention aux nombreuses fonctions d'égalité pour cette partie particulière pour faire n'importe quoi avec moi. J'étais sous l'hypothèse (incorrecte) que "cela devrait faire ce dont j'ai besoin". – Justicle

Questions connexes