2009-09-11 5 views
19

Ich versuche, einen "Wörterbuch" -Typ zu erstellen - dh Hash-Tabelle mit einer Zeichenfolge als Schlüssel. Ist das in Lisp möglich oder sinnvoll?Verwendung von String-Objekt als Hash-Schlüssel in Common Lisp

bemerkte ich, dass dies wie erwartet funktioniert:

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

Allerdings ist die folgende nicht:

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

Antwort

31

Sie benötigen Hash-Tabelle zu machen, die 'gleich statt, wenn' eql verwendet. 'eql evaluiert nicht zwei Strings mit gleichem Inhalt für' t, während 'equal' tut.

Hier ist, wie Sie es tun:

(make-hash-table :test 'equal) 

Wie skypher bemerkt man auch statt ‚equalp verwenden können, wenn Sie Groß- und Kleinschreibung String Hashing wollen.

+3

Justicle, hat die CLHS nur dies als ein Beispiel. Wenn es nicht offensichtlich ist, kann die Dokumentation hilfreich sein: http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm –

+6

Verwenden Sie stattdessen EQUALP, wenn Sie die Groß-/Kleinschreibung von Groß- und Kleinschreibung ignorieren möchten. – skypher

+0

Danke Leute. Ich hatte die Dokumente überprüft, aber ich hatte den vielen Gleichheitsfunktionen für diesen speziellen Teil nicht genug Aufmerksamkeit geschenkt, um irgendetwas mit mir zu joggen. Ich war unter der (falschen) Annahme, dass "es tun sollte, was ich brauche". – Justicle