История изменений
Исправление korvin_, (текущая версия) :
То-есть let у нас не создает замыкания? Не всегда?
(let ((var1 exp1) ...) body ...)
раскрывается в
((lambda (var1 ...) body ...) exp1 ...)
И да, замыкание происходит, когда выходишь из скоупа, в котором процедура создана и передаешь эту процедуру во внешний (по отношению к тому, в котором она была создана) скоуп, при этом она сохраняет все внутренние связи своего скоупа.
(define (make-counter init)
; в этом скоупе определена переменная init
(lambda ()
(set! init (+ init 1))
init))
; а тут уже не определена
(define c1 (make-counter 0))
; c1 замкнута на свой скоуп, где определена переменная init
(c1)
; => 1
(c1)
; => 2
...
В твоем случае никакого дополнительного скоупа не создается, x — просто формальный параметр процедуры. Как в Си, Паскале, да и вообще практически в любом другом языке.
Исправление korvin_, :
То-есть let у нас не создает замыкания? Не всегда?
(let ((var1 exp1) ...) body ...)
раскрывается в
((lambda (var1 ...) body ...) exp1 ...)
И да, замыкание происходит, когда выходишь из скоупа, в котором процедура создана и передаешь эту процедуру во внешний (по отношению к тому, в котором она была создана) скоуп, при этом она сохраняет все внутренние связи своего скоупа.
(define (make-counter init)
; в этом скоупе определена переменная init
(lambda ()
(set! init (+ init 1))
init))
; а тут уже не определена
(define c1 (make-counter 0))
; c1 замкнута на свой скоуп, где определена переменная init
(c1)
; => 1
(c1)
; => 2
...
Исходная версия korvin_, :
То-есть let у нас не создает замыкания? Не всегда?
(let ((var1 exp1) ...) body ...) раскрывается в ((lambda (var1 ...) body ...) exp1 ...)
И да, замыкание происходит, когда выходишь из скоупа, в котором процедура создана и передаешь эту процедуру во внешний (по отношению к тому, в котором она была создана) скоуп, при этом она сохраняет все внутренние связи своего скоупа.
(define (make-counter init)
; в этом скоупе определена переменная init
(lambda ()
(set! init (+ init 1))
init))
; а тут уже не определена
(define c1 (make-counter 0))
; c1 замкнута на свой скоуп, где определена переменная init
(c1)
; => 1
(c1)
; => 2
...