Я протестировал следующий код в 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.Что именно происходит?