5
我在編寫自動備忘錄時遇到了一些問題。在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的,包裝函數是這樣的:
(define (memoize-wrapper function)
(set! function (memoizer function)))
並希望創建一個名爲DEF備忘錄,其與memoize的-包裝定義函數宏。例如。宏可能會擴大到(memoizer(定義函數名參數的身體...)或類似的東西
所以,我應該能夠做到:
(def-memo (factorial n)
(cond
((= n 1) 1)
(else (* n (factorial (- n 1))))))
應創建的memoized版本階乘而不是正常的緩慢的。
我的問題是,
- 的memoize的封裝器不能正常工作,它不叫memoized功能,但原有的功能。
- 我不知道如何編寫宏內的定義。我如何確保我可以獲得變量長度參數和可變長度的主體?那麼我如何定義這個函數並用memoizer包裝它呢?
非常感謝。
WOW。這真是太棒了。你能簡單地評論你的代碼,特別是宏位。爲什麼有。 ?你爲什麼提供?你真的需要申請嗎?我是一個新手。謝謝。 – unj2 2009-07-01 00:01:00