При повторном вызове count1
вызывается fre sh make-counter
, поэтому ожидаемые результаты должны постоянно быть "0".
Нет, make-counter
- это не звонил снова. Снова вызывается самая внутренняя лямбда, потому что (make-counter)
вернула самую внутреннюю лямбду.
Чтобы увидеть это более четко, перепишите make-counter
следующим образом:
(define (make-counter)
(let ([next 0])
(lambda () ; <- This lambda is the return value of `(make-counter)`.
(let ([v next])
(set! next (+ next 1))
v))))
Чтобы увидеть это еще яснее, избавьтесь от make-counter
:
> (define count1 (let ([next 0])
(lambda ()
(let ([v next])
(set! next (+ next 1))
v))))
> (count1)
0
> (count1)
1
Каждый раз, когда вы выполняете (count1)
, вы выполняете тело лямбды.
Даже если вы вызываете (count1)
снова и снова, next
не станет 0
, потому что (count1)
будет выполнять только тело лямбды. next
был установлен на 0
только тогда, когда count1
был первоначально определен.