Ta

Tablas hash en Common Lisp

4 ejercicios

Acerca de Tablas hash

Las tablas hash en Common Lisp son estructuras de datos que sirven para almacenar datos asociativos. Asocian claves (que pueden ser cualquier objeto) a valores (que también pueden ser cualquier objeto).

Cómo crear tablas hash

Las tablas hash se pueden crear con la función make-hash-table.

La función make-hash-table acepta varios parámetros de palabra clave para ajustar con precisión tanto el tamaño inicial de la tabla hash como su umbral de redimensionado; consulta la documentación para obtener información completa sobre ellos. Más importante aún, también acepta un parámetro de palabra clave test que define cómo se comparan las claves al insertar, consultar y eliminar claves y valores. Los valores del argumento test pueden ser uno de 'eq, 'eql, 'equal o 'equalp, que se corresponden con los predicados genéricos de igualdad. El valor por defecto es 'eql.

Operaciones habituales con tablas hash

Para obtener un valor a partir de su clave se usa gethash. gethash acepta un [argumento opcional][concept-defualt-arguments] que actúa como el valor que se devuelve si la clave no está presente en la tabla hash. gethash también devuelve múltiples valores (explicados en otro concepto). El primer valor es el valor de esa clave en la tabla hash, el valor por defecto si se ha proporcionado, o NIL. El segundo valor es un Boolean que indica si la clave estaba presente en la tabla hash o no.

Para insertar un par de clave y valor se usa setf junto con gethash.

Para eliminar una clave y su valor, usa remhash.

Para eliminar todas las claves y valores, usa clrhash

Aunque una tabla hash en Common Lisp, igual que en otros lenguajes, no garantiza ningún orden, a veces puede resultar útil recorrerla procesando cada par clave-valor. Esto se puede hacer con maphash:

(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)

(Esto imprimirá cada clave y su valor como un par cons, uno por línea.)

Referencia

(setf *hash-table* (make-hash-table))     ; => #<HASH-TABLE :TEST EQL :COUNT 0 {100375FD23}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
(gethash :foo *hash-table* 
         :default-value)                  ; => :DEFAULT-VALUE
                                          ;    NIL

(setf (gethash :foo *hash-table*) :bar)   ; => :BAR
(gethash :foo *hash-table*)               ; => :BAR
                                          ;    T

(setf (gethash :key *hash-table*) :value) ; => :RIGHT
(gethash :key *hash-table*)               ; => :VALUE
                                          ;    T

(remhash :key *hash-table*)               ; => T
(gethash :key *hash-table*)               ; => NIL
                                          ; => NIL
                            
(clrhash *hash-table*)                    ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
Editar en GitHub El enlace se abre en una nueva ventana o pestaña

Aprende Tablas hash

La práctica está bloqueada

Desbloquea 3 ejercicios más para practicar Tablas hash