Praktikum 8

  1. In der Prozedur konstr-abheben aus der Vorlesung wird die lokale Variable kontostand als Parameter erzeugt. Wir könnten die lokale Zustandsvariable auch explizit mit Hilfe von let erzeugen:
    (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))
  2. In dieser Aufgabe wollen wir Umgebungsstrukturen untersuchen, die bei Verwendung von Nachrichtenweitergabe entstehen. Betrachten Sie die Prozedur aus der Vorlesung zur Erzeugung von Bankkonten:
    (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?