Le tabelle hash in Common Lisp sono strutture dati per memorizzare dati associativi. Mappano chiavi (che possono essere qualsiasi oggetto) a valori (che possono essere qualsiasi oggetto). Altri linguaggi possono riferirsi a questo concetto con i nomi «map», «dictionary» o «hash».
Le tabelle hash si possono creare con la funzione make-hash-table.
(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>
(Nota: la rappresentazione stampata di una tabella hash dipende dall'implementazione, quindi potrebbe apparire diversamente nella tua REPL.)
Per ottenere un valore a partire da una chiave della tabella hash si usa la funzione gethash:
*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
; T
gethash restituisce valori multipli, che saranno spiegati in un altro concetto.
Per inserire un valore in una tabella hash si usa setf insieme a gethash, così:
(setf (gethash :foo *hash-table*) :bar) : => :bar
Questo modifica il valore della chiave :foo nella tabella hash *hash-table* impostandolo a :bar.
Restituisce il valore.
L'uso di setf sarà spiegato in un altro concetto.
Lamont è un alieno Lisp che vuole scrivere il proprio videogioco. Un compito per cui ti ha chiesto aiuto è tenere traccia di una lista di punteggi migliori.
Definisci una funzione make-high-score-table che non prende alcun argomento e restituisce una nuova tabella hash vuota:
(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
Per aggiungere un giocatore alla tabella, definisci una funzione add-player che prende due argomenti:
Imposta il punteggio iniziale del giocatore a zero.
(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0
Per impostare il punteggio di un giocatore, definisci una funzione set-score che prende tre argomenti:
(set-score hash-table :louis 1234) ; => 1234
Per ottenere dalla tabella il punteggio di un giocatore, definisci una funzione get-score che prende due argomenti:
Questa funzione dovrebbe restituire il punteggio memorizzato per il giocatore.
Se non c'è alcun punteggio memorizzato per quel giocatore, o se quel giocatore non è ancora nella tabella, allora deve restituire 0.
(get-score hash-table :louis) ; => 1234
(get-score hash-table :lilly) ; => 0
(get-score hash-table :not-a-character-in-this-story) ; => 0
Per rimuovere un giocatore dalla tabella dei punteggi, definisci una funzione remove-player che prende due argomenti:
Questa funzione dovrebbe gestire senza problemi i casi in cui il giocatore non è ancora stato aggiunto alla tabella. Ovviamente, dopo che un giocatore è stato rimosso, se si ottiene il suo punteggio dalla tabella, questo sarà zero.
(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
Iscriviti a Exercism per imparare e padroneggiare Common Lisp con 27 concetti92 esercizi e il mentoring di persone reali, tutto gratis.