运行 从消息传递定义
Run define from message passing
(define (memoize message f)
(define (dispatch message)
(cond
((eq? message 'm) k)
((eq? message 'um) 20)))
(define (k)
(let ((table (make-table)))
(lambda (x)
(let ((previously-computed-result (lookup x table)))
(or previously-computed-result
(let ((result (f x)))
(insert! x result table)
result)
)))))
f)
(set! fib(memoize 'm fib))
我的想法是发送 m 作为消息,然后 ((eq? message 'm) k) 将检查为真,因此定义 k 将 运行 并更改 fib 因为设置! ,但是代码没有像我期望的那样工作,有人可以帮我吗
您需要调用 dispatch
和 return 结果。您只是 return调用了与调用时相同的函数。
并且在 dispatch
中你需要调用 k
,而不仅仅是 return 它,因为它 return 是具有查找 table 的闭包.
(define (memoize message f)
(define (dispatch message)
(cond
((eq? message 'm) (k))
((eq? message 'um) 20)))
(define (k)
(let ((table (make-table)))
(lambda (x)
(let ((previously-computed-result (lookup x table)))
(or previously-computed-result
(let ((result (f x)))
(insert! x result table)
result)
)))))
(dispatch message))
(define (memoize message f)
(define (dispatch message)
(cond
((eq? message 'm) k)
((eq? message 'um) 20)))
(define (k)
(let ((table (make-table)))
(lambda (x)
(let ((previously-computed-result (lookup x table)))
(or previously-computed-result
(let ((result (f x)))
(insert! x result table)
result)
)))))
f)
(set! fib(memoize 'm fib))
我的想法是发送 m 作为消息,然后 ((eq? message 'm) k) 将检查为真,因此定义 k 将 运行 并更改 fib 因为设置! ,但是代码没有像我期望的那样工作,有人可以帮我吗
您需要调用 dispatch
和 return 结果。您只是 return调用了与调用时相同的函数。
并且在 dispatch
中你需要调用 k
,而不仅仅是 return 它,因为它 return 是具有查找 table 的闭包.
(define (memoize message f)
(define (dispatch message)
(cond
((eq? message 'm) (k))
((eq? message 'um) 20)))
(define (k)
(let ((table (make-table)))
(lambda (x)
(let ((previously-computed-result (lookup x table)))
(or previously-computed-result
(let ((result (f x)))
(insert! x result table)
result)
)))))
(dispatch message))