Tabelas hash em Common Lisp são estruturas de dados para armazenar dados associativos. Elas mapeiam chaves (que podem ser qualquer objeto) para valores (que também podem ser qualquer objeto). Outras linguagens podem se referir a esse conceito como mapas, dicionários ou hashes.
Tabelas hash podem ser criadas com a função make-hash-table.
(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>
(Repare que a apresentação impressa de uma tabela hash depende da implementação, então ela pode aparecer de forma diferente no seu REPL.)
Para obter um valor a partir de uma chave na tabela hash, você usa a função gethash:
*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
; T
gethash retorna múltiplos valores, o que será explicado em outro conceito.
Para inserir um valor em uma tabela hash, você usa setf com gethash assim:
(setf (gethash :foo *hash-table*) :bar) : => :bar
Isso modifica o valor da chave :foo na tabela hash *hash-table* para :bar.
Isso retorna o valor.
O uso de setf será explicado em outro conceito.
Lamont é um alienígena Lisp que quer criar o próprio videogame. Uma das tarefas com que ele pediu sua ajuda é manter o controle de uma lista de recordes.
Defina uma função make-high-score-table que não recebe nenhum argumento e resulta em uma nova tabela hash vazia:
(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
Para adicionar um jogador à tabela, defina uma função add-player que recebe dois argumentos:
Defina a pontuação inicial do jogador como zero.
(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0
Para definir a pontuação de um jogador, defina uma função set-score que recebe três argumentos:
(set-score hash-table :louis 1234) ; => 1234
Para obter a pontuação de um jogador na tabela, defina uma função get-score que recebe dois argumentos:
Essa função deve resultar na pontuação armazenada para o jogador.
Se não houver pontuação armazenada para esse jogador, ou se ele ainda não estiver na tabela, o resultado deve ser 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 remover um jogador da tabela de recordes, defina uma função remove-player que recebe dois argumentos:
Essa função deve lidar sem problemas com casos em que o jogador ainda não foi adicionado à tabela. Obviamente, depois que um jogador é removido, se você obtiver a pontuação dele na tabela, ela será 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
Crie sua conta no Exercism para aprender e dominar Common Lisp com 27 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.