Ta

Tabelas hash em Common Lisp

4 exercícios

Sobre Tabelas hash

As 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).

Criando tabelas hash

Tabelas hash podem ser criadas com a função make-hash-table.

A função make-hash-table recebe vários parâmetros de palavra-chave para ajustar o tamanho inicial da tabela hash e o seu limite de redimensionamento; consulte a documentação para informações completas sobre isso. Mais importante ainda, ela também recebe um parâmetro de palavra-chave test, que define como as chaves são comparadas durante a inserção, a busca e a remoção de chaves e valores. Os valores do argumento test podem ser 'eq, 'eql, 'equal ou 'equalp, que correspondem aos predicados de igualdade genéricos. O valor padrão é 'eql.

Operações comuns em tabelas hash

Para obter um valor pela sua chave, usa-se gethash. gethash recebe um [argumento opcional][concept-defualt-arguments] que funciona como o valor a ser retornado caso a chave não esteja presente na tabela hash. gethash também retorna múltiplos valores (explicados em outro conceito). O primeiro valor é o valor dessa chave na tabela hash, o valor padrão, se fornecido, ou NIL. O segundo valor é um Boolean que indica se a chave estava presente na tabela hash ou não.

Para inserir um par chave-valor, usa-se setf junto com gethash.

Para remover uma chave e o seu valor, use remhash.

Para remover todas as chaves e valores, use clrhash

Embora uma tabela hash em Common Lisp, assim como em outras linguagens, não tenha uma ordem garantida, às vezes pode ser útil iterar sobre ela processando cada par chave-valor. Isso pode ser feito com maphash:

(maphash #'(lambda (key value) (print (cons key value))) *hash-table*)

(Isso vai imprimir cada chave e valor como um par cons, um por linha.)

Referência

(setf *hash-table* (make-hash-table))     ; => #<HASH-TABLE :TEST EQL :COUNT 0 {100375FD23}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
(gethash :foo *hash-table* 
         :default-value)                  ; => :DEFAULT-VALUE
                                          ;    NIL

(setf (gethash :foo *hash-table*) :bar)   ; => :BAR
(gethash :foo *hash-table*)               ; => :BAR
                                          ;    T

(setf (gethash :key *hash-table*) :value) ; => :RIGHT
(gethash :key *hash-table*)               ; => :VALUE
                                          ;    T

(remhash :key *hash-table*)               ; => T
(gethash :key *hash-table*)               ; => NIL
                                          ; => NIL
                            
(clrhash *hash-table*)                    ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>
(gethash :foo *hash-table*)               ; => NIL
                                          ;    NIL
Editar via GitHub O link abre em uma nova janela ou aba

Aprenda Tabelas hash

A prática está bloqueada

Desbloqueie mais 3 exercícios para praticar Tabelas hash