Las tablas hash de 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 se refieren 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 representación impresa de una tabla hash depende de la implementación, por lo que puede aparecer de forma distinta en tu REPL).
Para obtener un valor a partir de una clave de la tabla hash, usa la función gethash:
*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
; T
gethash devuelve varios valores, que se explican en otro concepto.
Para insertar un valor en una tabla hash, usa setf junto con gethash así:
(setf (gethash :foo *hash-table*) :bar) : => :bar
Esto modifica el valor de la clave :foo en la tabla hash *hash-table* para que sea :bar.
Devuelve ese 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 ha pedido ayuda es llevar un registro de una lista de puntuaciones altas.
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 añadir un jugador a la tabla, define una función add-player que recibe dos argumentos:
Establece la puntuación inicial del jugador a cero.
(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0
Para establecer la puntuación de un jugador, define una función set-score que recibe tres argumentos:
(set-score hash-table :louis 1234) ; => 1234
Para obtener la puntuación de un jugador de la tabla, define una función get-score que recibe dos argumentos:
Esta función debe evaluar a la puntuación almacenada para el jugador.
Si no hay una puntuación almacenada para ese jugador, o ese 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 puntuaciones altas, define una función remove-player que recibe dos argumentos:
Esta función debe gestionar con elegancia los casos en los que el jugador aún no se ha añadido a la tabla. Obviamente, después de eliminar a un jugador, si se obtiene su puntuación de la tabla, 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.