Ta

Tablas hash en Common Lisp

4 ejercicios

Acerca de Tablas hash

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

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 el tamaño inicial de la tabla hash y su umbral de redimensionamiento; consulta la documentación para ver todos los detalles al respecto. Más importante aún, también acepta un parámetro de palabra clave test que define cómo se comparan las claves durante la inserción, la búsqueda y la eliminación de claves y valores. Los valores del argumento test pueden ser 'eq, 'eql, 'equal o 'equalp, que corresponden a los predicados de igualdad genéricos. El valor predeterminado es 'eql.

Operaciones comunes con las 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 (esto se explica en otro concepto). El primer valor es el valor de esa clave en la tabla hash, el valor predeterminado si se proporcionó, 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 todos los valores usa clrhash

Aunque una tabla hash en Common Lisp, igual que en otros lenguajes, no tiene un orden garantizado, a veces puede resultar útil iterar sobre ella procesando cada par de clave y valor. Esto se puede hacer con maphash:

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

(Esto imprimirá cada clave y cada 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 ventana o pestaña nueva

Aprende Tablas hash

La práctica está bloqueada

Desbloquea 3 ejercicios más para practicar Tablas hash