Usando el objeto de cadena como una clave de hash en Common Lisp
-
05-07-2019 - |
Pregunta
Estoy intentando crear un " diccionario " tipo - es decir, tabla hash con una cadena como clave. ¿Es esto posible o sabio en Lisp?
Noté 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, lo 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
Solución
Necesitas hacer una tabla hash que use 'igual en lugar de' eql. 'eql no evalúa dos cadenas con el mismo contenido que' t, mientras que 'igual hace'.
Así es como lo haces:
(make-hash-table :test 'equal)
Como señaló Skypher, también puedes usar 'equalp en su lugar si quieres un hashing de cadenas que no distinga mayúsculas y minúsculas.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow