LINUX.ORG.RU

История изменений

Исправление 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
...