Programador experiente de lisp, esquema e clojure que está migrando para o elisp do python para automatizar tarefas básicas rotineiras, cotidianas e básicas: tive uma enorme surpresa do seguinte em ielm
ELISP> (setq h2 (make-hash-table))
#s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ())
ELISP> (puthash "a" 1 h2)
1 (#o1, #x1, ?\C-a)
ELISP> (gethash "a" h2)
nil
Hã? A chave e o valor parecem estar presentes:
ELISP> h2
#s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ("a" 1))
/ bate na testa. Eu devo estar perdendo algo totalmente óbvio. Info diz:
-- Function: gethash key table &optional default
This function looks up KEY in TABLE, and returns its associated
VALUE—or DEFAULT, if KEY has no association in TABLE.
ótimo. Vamos ver se podemos gethash
retornar algo diferente de nil
:
ELISP> (gethash "a" h2 'fubar)
fubar
Uau. Ok, eu sou muito mais idiota do que eu pensava. O que diabos estou fazendo de errado?
:test
parâmetro no seu exemplo ...string-equal
pode ter algumas vantagensequal
se eu souber que minha tabela de hash possui cadeias apenas como chaves. Não sei ao certo por que o elisp possui ambosstring-equal
eequal
, porqueequal
pode ser usado em qualquer lugar questring-equal
possa ser usado modulo o fato destring-equal
gerar erros de tipo quando você não fornece strings. Talvez esse seja um comportamento desejado.