不识别字符串的哈希表键

时间:2013-02-22 21:41:43

标签: scheme key hashtable

Scheme的eqv-hashtable数据结构似乎无法识别字符串的键。在以下代码中,我创建了一个eqv-hashtable并创建了一个新数据:

(define state-hash (make-eqv-hashtable))
(hashtable-set! state-hash "S" (State "S" #f '() '()))

但是,当我尝试检查我的数据是否存储在哈希表中时,我会遇到以下情况:

(hashtable-contains? state-hash "S")  ; --> #f

虽然hashtable-contains?过程显示密钥"S"当前不在哈希表中,但以下建议:

(hashtable-keys state-hash)   ; --> #("S")

如果我为密钥使用字符串以外的东西,例如符号(例如'S),我没有任何问题。任何想法为什么它不喜欢字符串作为键?

2 个答案:

答案 0 :(得分:3)

eqv?仅在其参数引用完全相同的对象时才返回#t。试试这个:

(define key "S")
(define state-hash (make-eqv-hashtable))
(hashtable-set! state-hash key (State "S" #f '() '()))
(hashtable-contains? state-hash key)

答案 1 :(得分:1)

你试过make-equal-hashtable吗?我对这些经验不多,但我知道

(define str "S")
(eqv? str "S") => #f
(equal? str "S") => #t

http://www.gnu.org/software/mit-scheme/documentation/mit-scheme-ref/Equivalence-Predicates.html#Equivalence-Predicates

编辑:奥斯卡有一个很好的解决方案