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。