views:

285

answers:

1

Hi folks,

I'm trying to create a "dictionary" type - ie hash table with a string as a key. Is this possible or wise in Lisp?

I noticed that this works as expected:

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

However, the following does not:

> (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
+12  A: 

You need to make hash-table that uses 'equal instead if 'eql. 'eql doesn't evaluate two strings with same content to 't, while 'equal does.

Here is how you do it:

(make-hash-table :test 'equal)

As skypher noted you can also use 'equalp instead if you want case-insensitive string hashing.

freiksenet
Justicle, the CLHS just has this as an example. If it is not obvious, looking at the documentation might help: http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm
Rainer Joswig
Use EQUALP instead if you want case-insensitive string hashing.
skypher
Thanks folks. I had checked the docs, but I hadn't really payed enough attention to the many equality functions for that particular part to jog anything with me. I was under the (incorrect) assumption that "it should just do what I need".
Justicle