Scheme で自動メモライザーを作成します。マクロとラッパーのヘルプ
-
21-08-2019 - |
質問
Scheme で自動メモライザーを作成しているときに、いくつかの問題に直面しています。
ハッシュテーブルを作成し、値がすでに計算されているかどうかを確認する機能するメモマイザー関数があります。以前に計算されている場合は値を返し、それ以外の場合は関数を呼び出します。
(define (memoizer fun)
(let ((a-table (make-hash)))
(λ(n)
(define false-if-fail (λ() #f))
(let ((return-val (hash-ref a-table n false-if-fail)))
(if return-val
return-val
(begin
(hash-set! a-table n (fun n))
(hash-ref a-table n)))))))
ここで、次のような memoize-wrapper 関数を作成したいと思います。
(define (memoize-wrapper function)
(set! function (memoizer function)))
そしてできれば、memoize-wrapper を使用して関数を定義する def-memo というマクロを作成します。例えば。マクロは (memoizer (関数名引数本体を定義する ...) などに展開できます。
だから私はできるはずです:
(def-memo (factorial n)
(cond
((= n 1) 1)
(else (* n (factorial (- n 1))))))
これにより、通常の遅い階乗の代わりにメモ化された階乗が作成されます。
私の問題は、
- memoize-wrapper が正しく動作していません。メモ化された関数ではなく、元の関数が呼び出されます。
- マクロ内に定義を記述する方法がわかりません。可変長の引数と可変長の本体を確実に取得できるようにするにはどうすればよいですか?次に、関数を定義してメモマイザーでラップするにはどうすればよいでしょうか?
どうもありがとう。
解決
これは私がPLTスキームで使用するものです
#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)
所属していません StackOverflow