2009-09-11 111 views
19

我試圖創建一個「字典」類型 - 即使用字符串作爲鍵的散列表。在Lisp中這是可能的還是明智的?在Common 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 

回答

31

你需要做的是使用哈希表「平等,而不是當」 EQL。 'eql不會評估兩個具有相同內容的字符串't',而''相同。

這裏是你如何做到這一點:

(make-hash-table :test 'equal) 

由於skypher指出,如果你想不區分大小寫的哈希你也可以使用「equalp代替。

+3

Justicle,CLHS只是以此爲例。如果不明顯,查看文檔可能會有所幫助:http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm – 2009-09-11 06:25:24

+6

如果您希望區分大小寫的字符串散列,請使用EQUALP。 – skypher 2009-09-11 16:50:25

+0

謝謝大家。我檢查過這些文檔,但我沒有真正關注這個特定部分的許多平等功能,以便跟我一起慢跑。我在(不正確)的假設下「應該只是做我需要的」。 – Justicle 2009-09-13 01:15:47