Racket 在球拍中,make hash和make弱hash有什么区别?
查找备忘录功能时发现此问题:Racket 在球拍中,make hash和make弱hash有什么区别?,racket,Racket,查找备忘录功能时发现此问题: #lang scheme (define (memo f) (define mh (make-hash)) (lambda p (hash-ref mh p (lambda () (hash-set! mh p (apply f p)) (hash-ref mh p))))) (define-syntax-rule (defmemo (id . p) . body
#lang scheme
(define (memo f)
(define mh (make-hash))
(lambda p
(hash-ref mh p (lambda ()
(hash-set! mh p (apply f p))
(hash-ref mh p)))))
(define-syntax-rule (defmemo (id . p) . body)
(define id (memo (lambda p . body))))
(provide defmemo)
如图所示:
然而,在文档中还有:生成弱散列和生成不可变散列。哪个散列函数更适合记忆?好问题
我想说,对于回忆录,坚持使用生成散列是最好的选择。其他选项用于不同的目的
makeimmutablehash
是用来制作不可变哈希表的,你猜对了。它创建的哈希表与使用hash
创建的哈希表相同。当然,表中的项仍然可以是可变的,例如,如果在其中放置可变结构。只是表本身是不可变的
makehash
用于生成可变哈希表。这可能是您在这里想要的,因为您正在修改您的备忘表
生成弱散列实际上是完全不同的。具体来说,它存储指向表中项目的“弱”指针。也就是说,就垃圾收集器而言,它不算作指针。因此,如果你使用它们,你的物品最终可能会被收集。(这并不意味着您将获得segfault,您可能会丢失数据。)因此,您通常不想要此表,除非您知道您特别想要此行为
在哪里使用弱散列
?任何时候,您都不希望GC仅因为对象在您的表中而保留对象。例如,如果要实现终结器,可能需要使用makeweakhash。