Lambda Scheme-闭包中的访问变量
假设我在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))
(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函数定义下面,就得到了我想要的结果。谢谢: