写作计划自动memoizer。 帮助与宏观和包装(Writing an auto-memoize

2019-09-17 08:47发布

我现在面临几个问题,而写在方案自动memoizer。

我有一个工作memoizer功能,及牡丹哈希表,并检查该值已经计算出来。 如果已经在此之前计算它返回其他的价值,它调用函数。

(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. 我不知道如何写宏的内部定义。 如何确保我能得到可变lenght参数和可变长度的身体? 我如何再定义功能,并与memoizer它环绕?

非常感谢。

Answer 1:

这是我在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)


文章来源: Writing an auto-memoizer in Scheme. Help with macro and a wrapper