像"hash"这样的检查吗在Racket支持鸭子打字



我是Racket的Python程序员。。。

我看到了一些代码,比如:

(define table/c (and/c hash? (not/c immutable?)))

我理解这是对合同的使用,即。https://docs.racket-lang.org/reference/data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fbase..rkt%29._and%2Fc%29%29

因此,这意味着在这个库中接受table/c参数的任何地方,它都应该是一个可变哈希表对象。

我的问题是…Racket在这里支持鸭子打字吗(特别是为了满足hash?的合同(?

假设我想用有k/v存储支持的东西来替换基本哈希表。。。我是否可以实现一个"哈希表"接口,允许我的存储支持的自定义对象通过hash?合同检查?

合同的文档和hash?检查的文档对我没有太大帮助。

我认为您真的想使用字典来实现这一点,但如果您的库需要hash?来进行合同检查,那么您可以使用模仿者。

这是我写的一个函数,它试图使用弱哈希。它有一个缓存,用于一些可能昂贵的计算,由(命名错误的(filler函数表示,该函数将在丢失的键上被调用。

我对这类事情的语义很不确定(我不是这方面的专家(,但它在实践中是有效的。

(define (make-cache filler)
(impersonate-hash
(make-weak-hash '())
(λ (ht key)
;; impersonate hash-ref by calling the filler
(unless (hash-has-key? ht key)
;; I think this is safe as the key won't be dropped
(hash-set! ht key (filler key)))
(values key (λ (ht k v) v)))
;; Everything else is passed through
(λ (ht k v)
(values k v))
(λ (ht k)
k)
(λ (ht k)
k)))

相关内容

最新更新