Lambda Scheme-闭包中的访问变量

Lambda Scheme-闭包中的访问变量,lambda,scheme,closures,counter,let,Lambda,Scheme,Closures,Counter,Let,假设我在Scheme中有以下闭包,每次调用它都会增加一个计数器: (define count (let ((next 0)) (lambda () (set! next (+ next 1)) next))) 我的问题很简单,如何重新编写此函数,以便在不增加计数器的情况下访问next的值?我试过和兰博达斯一起玩,但我就是想不出来 编辑:某些上下文: (define (dispatch m) (let ((count 0))

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

 (define count
   (let ((next 0))
     (lambda ()
         (set! next (+ next 1))
         next)))
我的问题很简单,如何重新编写此函数,以便在不增加计数器的情况下访问next的值?我试过和兰博达斯一起玩,但我就是想不出来

编辑:某些上下文:

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

目前还不完全清楚计数与银行账户示例之间的关系,但简单到

(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`
可能就是你要找的

主要思想是:

在此处创建变量可以存在的范围:makeaccount过程的范围 在此范围内创建变量:让计数为0 只需在此处的范围内访问它:设置或获取计数 返回在此范围内包含变量的内容:dispatch闭包。 然后,您可以定义acc dispatch make account,然后使用acc dispatch“count”检索当前计数,但如果需要,您仍然可以使用acc dispatch“next”增加当前计数


请注意,后者应用通过调用acc dispatch“next”返回的lambda。

您能否给出一个代码示例,该代码使用添加到主问题的next?值。在您提供的示例中,在这种情况下,内部计数将始终返回0,因为您将其与let绑定。您必须更改分派函数中计数的定义。我想你会这么做,但我不确定你的问题不会重现你提到的问题[[dispatch'transaction]]=[[count]],不管你在评论中怎么说。这使搜索此问题或类似问题答案的人感到困惑。谢谢,问题是我的let count 0所在的位置,它在不正确的范围内。把它放在main函数定义下面,就得到了我想要的结果。谢谢: