Portál AbcLinuxu, 30. dubna 2025 08:50
(define (make-closure x) (lambda () (set! x (+ x 1)) x)) (define closure1 (make-closure 10)) (define closure2 (make-closure 20))nedokazu si to nejak moc dobre pomoci toho listu predstavit. minimalne by to mel byt strom...
(eval '(make-closure 10) env) => (eval '(lambda () (set! x (+ x 1)) x)) (cons '(x . 10) env)) (eval '(make-closure 20) env) => (eval '(lambda () (set! x (+ x 1)) x)) (cons '(x . 20) env))Každá closure má svoji vlastní verzi x. Tedy pro interpreter, pro kompilátor by bylo potřeba mít v alistu ne hodnotu, ale nějaký odkaz na skutečné místo kde ta data budou. Co přehlížím?
(define closure1 (make-closure 10)) (define closure2 (make-closure 20))diky lexikalnimu rozsahu musi byt prostredi z (make-closure) zachovane... a nemuzu prijit na to, jak by v tom seznamu byly usporadane, aby fungovalo vyhledavani... nicmene toto by fungovalo moc dobre pri dynamickem rozsahu...
(cons '(x 10/20) env)
.
No, vlastně je výsledné prostředí, nazíráno globálně, opravdu strom. :) Ale v každém určitém místě je z něj vidět jen seznam.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.