2016-12-11 8 views
2

は、この中にはmemoizing機能を探して見つから:ラケットのmake-hash make-weak-hashの違いは何ですか?

#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

は、しかし、マニュアルにもあります:弱ハッシュを作成し、メイク不変ハッシュを。どのハッシュ関数がメモ作成に適していますか?

答えて

1

大きな質問です。

私はmake-hashで固執しているメモのためのあなたの最善の策だと思います。他のオプションは異なる目的で使用されます。

  • make-immutable-hashあなたはそれを推測していますが、不変のハッシュテーブルです。作成するハッシュテーブルは、hashで作成したものと同じです。もちろん、 'in'の項目は、変更可能な構造体をそこに配置するなど、変更可能です。テーブル自体は変更可能ではありません。

  • make-hashは、可変ハッシュテーブルの作成に使用されます。これはおそらく、あなたがメモ化テーブルを突然変異させているので、ここであなたが望むものです。

  • make-weak-hashは実際には全く異なります。具体的には、テーブル内の項目に「弱い」ポインタを格納します。つまり、ガベージコレクタに関する限り、ポインタとしてカウントされません。したがって、それらを使用すると、アイテムが収集される可能性があります。 (これは、あなたがセグメンテーションを取得するという意味ではなく、あなたのデータを失うかもしれません)。したがって、この動作を特に必要としていることがわかっていない限り、このテーブルは通常ありません。

+0

'make-weak-hash'はどこで使用されますか? – X10D

+0

GCがあなたのテーブルの中だけにあなたのオブジェクトを保持しないようにしたいときはいつでも。たとえば、ファイナライザを実装する場合は、make-weak-hashを使用することができます。 –