Как работают замыкания в Схеме? - PullRequest
3 голосов
/ 10 апреля 2011

Я протестировал следующий код в Racket / DrScheme:

(define (makem)
    (define x 34)
    (list (lambda () (set! x (+ x 1)) x)
          (lambda () (set! x (+ x 1)) x))
)

(define f (car (makem)))
(define f2 (car (cdr (makem))))

> (f)
35
> (f2)
35            ; I thought this would give me 36
> (f)
36
> (f)
37
>

Получает ли каждая лямбда, созданная внутри вызова функции, копию каждой переменной в своей области видимости?Это как какой-то неявный пусть?Я ожидал, что лямбды будут иметь своего рода указатель на область, в которой они были созданы, что позволит им получить доступ к переменным стека, но это говорит мне об обратном, поскольку f и f2, похоже, имеют разные копии x.Что именно происходит?

1 Ответ

6 голосов
/ 10 апреля 2011

Вы дважды позвонили (makem), поэтому создали две разные среды с двумя разными копиями x.Если бы вы позвонили (makem) один раз, например, так:

(define m (makem))
(define f (car m))
(define f2 (car (cdr m)))

, тогда f и f2 действительно будут использовать тот же x, что и в m.

...