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). Otros lenguajes pueden referirse a este concepto como mapas, diccionarios o hashes.
Las tablas hash se pueden crear con la función make-hash-table.
(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>
(Ten en cuenta que la presentación impresa de una tabla hash depende de la implementación, así que puede verse diferente en tu REPL.)
Para obtener un valor a partir de una clave de la tabla hash, usas la función gethash:
*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
; T
gethash devuelve múltiples valores, lo cual se explicará en otro concepto.
Para insertar un valor en una tabla hash, usas setf junto con gethash de esta manera:
(setf (gethash :foo *hash-table*) :bar) : => :bar
Esto modificará el valor de la clave :foo en la tabla hash *hash-table* para que sea :bar.
Devuelve el valor.
El uso de setf se explicará en otro concepto.
Lamont es un alienígena de Lisp que quiere escribir su propio videojuego. Una de las tareas para las que te pidió ayuda es llevar un registro de la lista de puntajes altos.
Define una función make-high-score-table que no recibe ningún argumento y evalúa a una nueva tabla hash vacía:
(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
Para agregar un jugador a la tabla, define una función add-player que recibe dos argumentos:
Establece el puntaje inicial del jugador en cero.
(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0
Para establecer el puntaje de un jugador, define una función set-score que recibe tres argumentos:
(set-score hash-table :louis 1234) ; => 1234
Para obtener el puntaje de un jugador de la tabla, define una función get-score que recibe dos argumentos:
Esta función debe evaluar al puntaje almacenado para el jugador.
Si no hay un puntaje almacenado para ese jugador, o si el jugador todavía no está en la tabla, debe evaluar a 0.
(get-score hash-table :louis) ; => 1234
(get-score hash-table :lilly) ; => 0
(get-score hash-table :not-a-character-in-this-story) ; => 0
Para eliminar a un jugador de la tabla de puntajes altos, define una función remove-player que recibe dos argumentos:
Esta función debe manejar sin problemas los casos en los que el jugador todavía no se agregó a la tabla. Obviamente, después de eliminar a un jugador, si se obtiene su puntaje de la tabla, este será cero.
(set-score hash-table :louis 1234) ; => 1234
(remove-player hash-table :louis) ; => T
(get-score hash-table :louis) ; => 0
(remove-player hash-table :not-in-the-table) ; => NIL
Regístrate en Exercism para aprender y dominar Common Lisp con 27 conceptos92 ejercicios y mentoría humana real, todo gratis.