2009-09-11 70 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