Programmeur expérimenté, lisp, schema, clojure passant à elisp de python pour automatiser les tâches de base de routine, quotidiennes: j'ai eu une énorme surprise de ce qui suit dans 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
hein? La clé et la valeur semblent être présentes:
ELISP> h2
#s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ("a" 1))
/ gifle le front. Je dois manquer quelque chose de totalement évident. L'info dit:
-- 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.
génial. Voyons voir si nous pouvons obtenir gethash
de retourner autre chose que nil
:
ELISP> (gethash "a" h2 'fubar)
fubar
sensationnel. Ok, je suis beaucoup plus bête que je ne le pensais. Qu'est-ce que je fais de mal?
:test
paramètre dans votre exemple ...string-equal
pourrait avoir quelques avantagesequal
si je sais que ma table de hachage a des chaînes uniquement comme clés. Je ne sais pas pourquoi elisp a les deuxstring-equal
etequal
, parce queequal
peut être utilisé n'importe quel endroit quistring-equal
peut être utilisé modulo le fait questring-equal
jette des erreurs de type lorsque vous ne lui donnez pas de chaînes. C'est peut-être un comportement souhaité.