gpt4 book ai didi

functional-programming - 在Scheme中编写一个自动内存。帮助宏和包装器

转载 作者:行者123 更新时间:2023-12-04 18:54:29 26 4
gpt4 key购买 nike

在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定义函数。例如。宏可以扩展为(内存(定义函数名参数主体...)或类似的东西。

这样我就可以做到:
(def-memo (factorial n)
(cond
((= n 1) 1)
(else (* n (factorial (- n 1))))))

它应该创建一个阶乘的内存版本,而不是普通的慢速版本。

我的问题是
  • memoize-wrapper无法正常工作,它没有调用memorized函数,而是调用原始函数。
  • 我不知道如何在宏内部编写定义。如何确保可以获取可变长度参数和可变长度主体?然后,如何定义函数并将其与备忘录存储在一起?

  • 非常感谢。

    最佳答案

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

    关于functional-programming - 在Scheme中编写一个自动内存。帮助宏和包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1066414/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com