球拍中的make-hash make-weak-hash有什么区别?

时间:2016-12-11 00:37:53

标签: 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)
  (define id (memo (lambda p . body))))

(provide defmemo)

如此处所示:Writing an auto-memoizer in Scheme. Help with macro and a wrapper

然而,在文档中还有:make-weak-hash和make-immutable-hash。哪个哈希函数更适合记忆?

1 个答案:

答案 0 :(得分:1)

很棒的问题。

我想说的是,保留make-hash是最好的选择。其他选项用于不同目的。

  • make-immutable-hash用于制作,嗯,你猜对了,不可变的哈希表。它创建的哈希表与使用hash创建的哈希表相同。当然,表中的项目仍然是可变的,例如,如果你在那里放置一个可变结构。它只是表本身不可变。

  • make-hash用于制作可变哈希表。这可能是你想要的,因为你正在改变你的memoization表。

  • make-weak-hash实际上完全不同。具体来说,它存储表中项目的“弱”指针。也就是说,就垃圾收集器而言,它不算作指针。因此,如果您使用它们,您的物品最终可能会被收集。 (这并不意味着你会得到一个段错误,你可能会丢失你的数据。)因此,除非你知道你特别想要这种行为,否则你通常不需要这个表。