首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在“计划”中写一个回忆录。宏和包装器的帮助

在“计划”中写一个回忆录。宏和包装器的帮助
EN

Stack Overflow用户
提问于 2009-06-30 22:28:38
回答 1查看 947关注 0票数 5

我在计划中写一个自动回忆录时遇到了几个问题.

我有一个工作回忆器函数,它创建一个哈希表并检查该值是否已经计算过。如果在此之前已经计算过,则返回调用函数的值。

代码语言:javascript
运行
复制
(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)))))))

现在,我想创建这样一个回忆录包装函数:

代码语言:javascript
运行
复制
(define (memoize-wrapper function)
  (set! function (memoizer function)))

并希望创建一个名为def-memo的宏,它用回忆录包装器定义函数。例如:宏可以扩展到(回忆录(定义函数名参数体.)或者类似的东西。

这样我才能做到:

代码语言:javascript
运行
复制
(def-memo (factorial n)
  (cond
    ((= n 1) 1)
    (else (* n (factorial (- n 1))))))

它应该创建一个因子的回忆录版本,而不是普通的缓慢版本。

我的问题是

  1. 回忆录包装器工作不正常,它不是调用回忆录函数,而是调用原始函数。
  2. 我不知道如何在宏内部编写定义。如何确保可以得到可变的长参数和变长的主体?然后如何定义函数并将其与回忆录包装在一起呢?

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-30 22:45:37

这就是我在PLT计划中使用的:

代码语言:javascript
运行
复制
#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)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1066414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档