2009-06-30 26 views
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版本階乘而不是正常的緩慢的。

我的問題是,

  1. 的memoize的封裝器不能正常工作,它不叫memoized功能,但原有的功能。
  2. 我不知道如何編寫宏內的定義。我如何確保我可以獲得變量長度參數和可變長度的主體?那麼我如何定義這個函數並用memoizer包裝它呢?

非常感謝。

回答

6

這是我在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) 
+0

WOW。這真是太棒了。你能簡單地評論你的代碼,特別是宏位。爲什麼有。 ?你爲什麼提供?你真的需要申請嗎?我是一個新手。謝謝。 – unj2 2009-07-01 00:01:00