http://qs321.pair.com?node_id=719544


in reply to Re^3: Lexical closures
in thread Lexical closures

OK, I took some time to mock out some Scheme: here are both behaviours you've seen:

(define cclosures (lambda (values) (cond ((null? values) '()) (else (cons (lambda (x) (* (car values) x)) (cclosures (cdr values))))))) (define cclosures2 (let ((val -1)) (lambda (values) (cond ((null? values) '()) (else (begin (set! val (car values)) (cons (lambda (x) (* val x)) (cclosures2 (cdr values))))))))) (define clprint (lambda (closures) (map (lambda (fn) (fn 2)) closures))) > (clprint (cclosures '(0 1 2))) (0 2 4) > (clprint (cclosures2 '(0 1 2))) (4 4 4)

cclosures uses the equivalent ofdeclaring my $i inside the foreach loop: it defines a new variable called val for every iteration.

cclosures2 uses the equivalent of declaring my $i outside the foreach loop: val gets reassigned with every iteration.

Notice the closure closes over the variable, not the value. So when the variable is reassigned, the value inside the closure changes too.

HTH