Erfahrener Lisp-, Schema- und Clojure-Programmierer, der von Python zu Elisp wechselt, um routinemäßige, alltägliche Grundaufgaben zu automatisieren: Ich habe eine enorme Überraschung von den folgenden in bekommen 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
huh? Der Schlüssel und der Wert scheinen vorhanden zu sein:
ELISP> h2
#s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold 0.8 data ("a" 1))
Ich klatsche auf die Stirn. Mir muss etwas völlig Offensichtliches fehlen. Info sagt:
-- 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.
groß. Mal sehen, ob wir gethash
etwas anderes zurückgeben können als nil
:
ELISP> (gethash "a" h2 'fubar)
fubar
Beeindruckend. Ok, ich bin viel dümmer als ich dachte. Was um alles in der Welt mache ich falsch?
:test
in Ihrem Beispiel kein Symbol als Parameter ...string-equal
könnte einige Vorteile gegenüber haben,equal
wenn ich weiß, dass meine Hash-Tabelle nur Zeichenfolgen als Schlüssel enthält. Ich bin mir nicht sicher, warum elisp beides hatstring-equal
undequal
weilequal
es an jedem Ortstring-equal
verwendet werden kann, der modulo verwendet werden kann, die Tatsache, dassstring-equal
Typfehler ausgelöst werden, wenn Sie ihm keine Zeichenfolgen geben. Vielleicht ist das ein gewünschtes Verhalten.