Les tables de hachage en Common Lisp sont des structures de données qui permettent de stocker des données associatives. Elles associent des clés (qui peuvent être n'importe quel objet) à des valeurs (qui peuvent être n'importe quel objet). D'autres langages donnent à ce concept le nom de map, dictionary ou hash.
On peut créer des tables de hachage avec la fonction make-hash-table.
(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>
(Note que la représentation affichée d'une table de hachage dépend de l'implémentation, elle peut donc être différente dans le REPL.)
Pour récupérer une valeur à partir d'une clé dans la table de hachage, on utilise la fonction gethash :
*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
; T
gethash renvoie plusieurs valeurs, ce qui sera expliqué dans un autre concept.
Pour insérer une valeur dans une table de hachage, on utilise setf avec gethash comme ceci :
(setf (gethash :foo *hash-table*) :bar) : => :bar
Cela remplace par :bar la valeur associée à la clé :foo dans la table de hachage *hash-table*.
Elle renvoie la valeur.
L'utilisation de setf sera expliquée dans un autre concept.
Lamont est un alien Lisp qui veut écrire son propre jeu vidéo. L'une des tâches pour lesquelles il t'a demandé de l'aide consiste à tenir une liste des meilleurs scores.
Définis une fonction make-high-score-table qui ne prend aucun argument et renvoie une nouvelle table de hachage vide :
(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
Pour ajouter un joueur à la table, définis une fonction add-player qui prend deux arguments :
Initialise le score du joueur à zéro.
(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0
Pour définir le score d'un joueur, définis une fonction set-score qui prend trois arguments :
(set-score hash-table :louis 1234) ; => 1234
Pour récupérer le score d'un joueur depuis la table, définis une fonction get-score qui prend deux arguments :
Cette fonction doit renvoyer le score enregistré pour le joueur.
Si aucun score n'est enregistré pour ce joueur, ou si ce joueur n'est pas encore dans la table, elle doit renvoyer 0.
(get-score hash-table :louis) ; => 1234
(get-score hash-table :lilly) ; => 0
(get-score hash-table :not-a-character-in-this-story) ; => 0
Pour supprimer un joueur de la table des meilleurs scores, définis une fonction remove-player qui prend deux arguments :
Cette fonction doit gérer proprement les cas où le joueur n'a pas encore été ajouté à la table. Évidemment, une fois qu'un joueur est supprimé, si on récupère son score depuis la table, celui-ci vaudra zéro.
(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
Inscris-toi sur Exercism pour apprendre et maîtriser Common Lisp avec 27 concepts92 exercices, et un vrai mentorat humain, le tout gratuitement.