Scheme 无法识别字符串的哈希表键

Scheme 无法识别字符串的哈希表键,scheme,key,hashtable,Scheme,Key,Hashtable,Scheme的eqv哈希表数据结构似乎无法识别字符串键。在以下代码中,我正在创建eqv哈希表并创建新的数据: (define state-hash (make-eqv-hashtable)) (hashtable-set! state-hash "S" (State "S" #f '() '())) 但是,当我尝试检查我的数据是否存储在哈希表中时,我遇到以下问题: (hashtable-contains? state-hash "S") ; --> #f 虽然哈希表中包含?过程显示键

Scheme的eqv哈希表数据结构似乎无法识别字符串键。在以下代码中,我正在创建eqv哈希表并创建新的数据:

(define state-hash (make-eqv-hashtable))
(hashtable-set! state-hash "S" (State "S" #f '() '()))
但是,当我尝试检查我的数据是否存储在哈希表中时,我遇到以下问题:

(hashtable-contains? state-hash "S")  ; --> #f
虽然哈希表中包含?过程显示键S当前不在哈希表中,以下建议不同:

(hashtable-keys state-hash)   ; --> #("S")
如果我使用字符串以外的其他东西作为键,例如符号,例如“S”,我没有任何问题。你知道为什么它不喜欢用字符串作为键吗?

你有没有尝试过创建相等的哈希表?我在这方面没有太多经验,但我知道这一点

(define str "S")
(eqv? str "S") => #f
(equal? str "S") => #t
编辑:Oscar有一个很好的解决方案

你有没有尝试过创建相等的哈希表?我在这方面没有太多经验,但我知道这一点

(define str "S")
(eqv? str "S") => #f
(equal? str "S") => #t
编辑:奥斯卡有一个很好的解决方案

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

(define key "S")
(define state-hash (make-eqv-hashtable))
(hashtable-set! state-hash key (State "S" #f '() '()))
(hashtable-contains? state-hash key)
eqv?仅当其参数引用完全相同的对象时才返回t。试试这个:

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

啊,当然。我忘记eqv了?谓语现在这是有道理的。另一种选择可能是使用makehashtable,我认为它允许传递不同的谓词。在这种情况下,我不想测试eqv?但是平等?。所以也许这就是解决问题的方法。@Dylan没错,如果你不需要对象等价性就可以更好地坚持等价性,这会让事情变得更简单。干杯啊,当然。我忘记eqv了?谓语现在这是有道理的。另一种选择可能是使用makehashtable,我认为它允许传递不同的谓词。在这种情况下,我不想测试eqv?但是平等?。所以也许这就是解决问题的方法。@Dylan没错,如果你不需要对象等价性就可以更好地坚持等价性,这会让事情变得更简单。干杯