在Scheme中编写一个自动记忆器。 有关宏和包装器的帮助

发布于 2024-07-25 16:34:53 字数 1029 浏览 5 评论 0原文

我在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-wrapper 函数:

(define (memoize-wrapper function)
  (set! function (memoizer function)))

并希望创建一个名为 def-memo 的宏,它用 memoize-wrapper 定义函数。 例如。 宏可以扩展为 (memoizer (define function-name argument body ...) 或类似的东西。

这样我应该能够做到:

(def-memo (factorial n)
  (cond
    ((= n 1) 1)
    (else (* n (factorial (- n 1))))))

这应该创建阶乘的记忆版本而不是正常的慢速版本。

我的问题是

  1. memoize-wrapper 无法正常工作,它不调用 memoized 函数,而是调用原始函数,
  2. 我不知道如何在宏内部编写定义。可变长度主体?然后如何定义该函数并将其包装在存储器中?

非常感谢。

I am facing a couple of problems while writing an auto-memoizer in Scheme.

I have a working memoizer function, which creats a hash table and checks if the value is already computed. If it has been computed before then it returns the value else it calls the function.

(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)))))))

Now I want to create a memoize-wrapper function like this:

(define (memoize-wrapper function)
  (set! function (memoizer function)))

And hopefully create a macro called def-memo which defines the function with the memoize-wrapper. eg. the macro could expand to (memoizer (define function-name arguments body ...) or something like that.

So that I should be able to do :

(def-memo (factorial n)
  (cond
    ((= n 1) 1)
    (else (* n (factorial (- n 1))))))

which should create a memoized version of the factorial instead of the normal slow one.

My problem is that the

  1. The memoize-wrapper is not working properly, it doesnt call the memoized function but the original function.
  2. I have no idea how to write a define inside of the macro. How do I make sure that I can get variable lenght arguments and variable length body? How do I then define the function and wrap it around with the memoizer?

Thanks a lot.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

找回味觉 2024-08-01 16:34:53

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

this is what i use in PLT scheme:

#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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文