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`
可能就是您要找的。
主要思想是:
- 创建变量可以存在的范围(此处:
make-account
过程的范围)
- 在该范围内创建您的变量(此处:
(let ((count 0))
)
- 只需在范围内访问它(此处:设置或获取
count
)
- Return 某物 具有范围内的变量(此处:
dispatch
闭包)。
然后您可以 (define acc-dispatch (make-account))
,随后使用 (acc-dispatch 'count)
检索当前计数,但如果需要,您仍然可以使用 ((acc-dispatch 'next))
.
增加它
请注意,后者 应用 通过调用 (acc-dispatch 'next)
返回的 lambda。
假设我在 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`
可能就是您要找的。
主要思想是:
- 创建变量可以存在的范围(此处:
make-account
过程的范围) - 在该范围内创建您的变量(此处:
(let ((count 0))
) - 只需在范围内访问它(此处:设置或获取
count
) - Return 某物 具有范围内的变量(此处:
dispatch
闭包)。
然后您可以 (define acc-dispatch (make-account))
,随后使用 (acc-dispatch 'count)
检索当前计数,但如果需要,您仍然可以使用 ((acc-dispatch 'next))
.
请注意,后者 应用 通过调用 (acc-dispatch 'next)
返回的 lambda。