Scheme - 在闭包中访问变量

Scheme - access variable in closure

假设我在 Scheme 中有以下闭包,每次调用时都会增加一个计数器:

 (define count
   (let ((next 0))
     (lambda ()
         (set! next (+ next 1))
         next)))

我的问题很简单,我怎样才能重写这个函数,这样我就可以在不增加计数器的情况下访问 next 的值?我尝试过使用 lambda,但我似乎无法弄明白。

编辑:一些上下文:

(define (dispatch m)
    (let ((count 0))
        (cond ((eq? m 'withdraw) withdraw) ; Increments count
              ((eq? m 'deposit) deposit) ; Increments count
              ((eq? m 'balance) balance-return)
              ((eq? m 'transaction) count) ; "count" on this line should return the value
              (else (error "Unknown request -- MAKE-ACCOUNT"
                           m)))))

尚不完全清楚 count 与银行帐户示例有何关系,但是一些简单如

(define (make-account)
    (let ((count 0)) ; Define `count` here...
        (define (dispatch m) ; ...and define `dispatch` such that `count` is in scope
            (cond ((eq? m 'next) ; On message 'next...
                   (lambda () (set! count (+ count 1)))) ; ...return the lambda, which has `count` in its scope
                  ((eq? m 'count) ; On message 'count...
                   count) ; ...return the current count
                  (else ; Otherwise...
                   (error "Unknown request -- MAKE-ACCOUNT" m)))) ...raise error
        dispatch)) ; Return `dispatch` from `make-account`

可能就是您要找的。

主要思想是:

  1. 创建变量可以存在的范围(此处:make-account 过程的范围)
  2. 在该范围内创建您的变量(此处:(let ((count 0))
  3. 只需在范围内访问它(此处:设置或获取 count
  4. Return 某物 具有范围内的变量(此处:dispatch 闭包)。

然后您可以 (define acc-dispatch (make-account)),随后使用 (acc-dispatch 'count) 检索当前计数,但如果需要,您仍然可以使用 ((acc-dispatch 'next)).

增加它

请注意,后者 应用 通过调用 (acc-dispatch 'next) 返回的 lambda。