运行 从消息传递定义

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