(define (konstr-abheben anfangs-betrag)
(let ((kontostand anfangs-betrag))
(lambda (betrag)
(if (>= kontostand betrag)
(sequence (set! kontostand (- kontostand betrag))
kontostand)
"Deckung nicht ausreichend"))))
Analysieren Sie mit Hilfe des Umgebungsmodells das Verhalten dieser alternativen Version von konstr-abheben bei den folgenden Interaktionen. Worin unterscheiden sich die Umgebungsstrukturen der beiden Versionen?
(define W1 (konstr-abheben 100))
(W1 50)
(define W2 (konstr-abheben 100))
(define (konstr-konto kontostand)
(define (abheben betrag)
(if (>= kontostand betrag)
(sequence (set! kontostand (- kontostand betrag))
kontostand)
"Deckung nicht ausreichend"))
(define (einzahlen betrag)
(set! kontostand (+ kontostand betrag))
kontostand)
(define (zuteilen m)
(cond ((eq? m 'abheben) abheben)
((eq? m 'einzahlen) einzahlen)
(else (error "Unbekannte Aufforderung -- KONSTR-KONTO" m))))
zuteilen)
Zeigen Sie die Umgebungsstruktur, die bei folgenden nacheinander ausgeführten Interaktionen erzeugt wird:
(define kto (konstr-konto 50))
((kto 'einzahlen) 40)
((kto 'abheben) 60)
Wo wird der lokale Zustand für kto festgehalten? Wir definieren ein weiteres Konto mit (define kto2 (konstr-konto 100))
. Wie werden die lokalen Zustände für die beiden Konten auseinandergehalten? Welche Teile der Umgebungsstruktur haben kto und kto2 gemeinsam?