2009-09-11 23 views
19

Estoy tratando de crear un tipo de "diccionario", es decir, una tabla hash con una cadena como clave. ¿Es esto posible o sabio en Lisp?Usando un objeto de cadena como una clave hash en Common Lisp

me di cuenta de que esto funciona como se esperaba:

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

Sin embargo, el siguiente no:

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

Respuesta

31

que necesita para hacer tabla hash que utiliza 'iguales en su lugar si' eql. 'eql no evalúa dos cadenas con el mismo contenido para' t, mientras que 'igual lo hace.

Así es como se hace:

(make-hash-table :test 'equal) 

Como skypher observó también puede utilizar 'equalp su lugar si desea entre mayúsculas y minúsculas hash cadena.

+3

Justicle, el CLHS simplemente tiene esto como ejemplo. Si no es obvio, puede ser útil consultar la documentación: http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm –

+6

Utilice EQUALP en su lugar si desea el hash de cadenas que no distingue entre mayúsculas y minúsculas. – skypher

+0

Gracias amigos. Había revisado los documentos, pero realmente no le había prestado suficiente atención a las muchas funciones de igualdad para esa parte en particular, para hacer que todo funcionara bien conmigo. Estaba bajo la suposición (incorrecta) de que "debería hacer lo que necesito". – Justicle

Cuestiones relacionadas