1

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),我没有任何问题。任何想法为什么它不喜欢字符串作为键?

4

2 回答 2

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)
于 2013-02-22T22:05:10.497 回答
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

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

于 2013-02-22T22:03:12.873 回答