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

Posted

技术标签:

【中文标题】球拍中的make-hash make-weak-hash有啥区别?【英文标题】:What is the difference between make-hash make-weak-hash in racket?球拍中的make-hash make-weak-hash有什么区别? 【发布时间】:2016-12-11 00:37:53 【问题描述】:

在寻找记忆功能时发现了这个:

#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】:

好问题。

我会说坚持make-hash 是你最好的选择。其他选项用于不同的目的。

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

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

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

【讨论】:

make-weak-hash 会在哪里使用? 任何时候你不希望 GC 只因为它在你的表中而保留你的对象。例如,如果你正在实现一个终结器,你可能想要使用 make-weak-hash。

以上是关于球拍中的make-hash make-weak-hash有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以首先获取参数,最后在球拍中的函数中获取名称?

let 中的球拍创建函数/lambda

如何将列表作为球拍中的参数列表传递?

球拍中的“匹配”可以有来自外部范围的变量模式吗?

是否有一种速记方法来更新球拍中的特定结构字段?

球拍中有参考类型吗?