unj*_*nj2 5 macros scheme functional-programming racket
在Scheme中编写自动记忆器时,我遇到了一些问题.
我有一个工作的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)))))))
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个memoize-wrapper函数,如下所示:
(define (memoize-wrapper function)
(set! function (memoizer function)))
Run Code Online (Sandbox Code Playgroud)
并希望创建一个名为def-memo的宏,它使用memoize-wrapper定义函数.例如.宏可以扩展为(memoizer(定义函数名称参数body ...)或类似的东西.
所以我应该能够做到:
(def-memo (factorial n)
(cond
((= n 1) 1)
(else (* n (factorial (- n 1))))))
Run Code Online (Sandbox Code Playgroud)
这应该创建一个memialized版本的阶乘而不是正常的慢阶段.
我的问题是
非常感谢.
这是我在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)
Run Code Online (Sandbox Code Playgroud)