在Scheme中编写一个自动记忆器。 有关宏和包装器的帮助
我在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))))))
这应该创建阶乘的记忆版本而不是正常的慢速版本。
我的问题是
- memoize-wrapper 无法正常工作,它不调用 memoized 函数,而是调用原始函数,
- 我不知道如何在宏内部编写定义。可变长度主体?然后如何定义该函数并将其包装在存储器中?
非常感谢。
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
- The memoize-wrapper is not working properly, it doesnt call the memoized function but the original function.
- 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是我在 PLT 方案中使用的:
this is what i use in PLT scheme: