2009-06-30 59 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