Grundkurs Common-Lisp WS 96|97

5. Übung (11-dez-1997)



Restrekursion (5 Punkte)

Definiere eine Funktion sum2() als restrekursive Variante der Funktion sum() aus dem 4. Übungsblatt. Eine Funktion heißt restrekursiv, wenn das Ergebnis (i.e. der Rückgabewert) des rekursiven Aufrufs nicht in eine weitere Berechnung eingeht, also nicht als Argument in eine andere Funktion eingesetzt ist.
Hinweis: Zum Problem der Umwandlung einer rekursiven Funktion in eine restrekursive Variante siehe das Beispiel in den Folienkopien vom 11-DEZ-97.



Auswertungsstrategie (2 Punkte)

Definiere eine Funktion, die zeigt, daß der Rumpf einer Funktionsdefinition zur Definitionszeit (also während der Auswertung des defun()) nicht evaluiert wird.



Bindungsumgebungen (2 + 2 + 2 + 2 Punkte)

Gegeben seien folgende globale Variablen und Funktionsdefinition:
        (defparameter foo 4)
        (defparameter bar 2)
        (defun verwirrung (foo)
          (print foo)
          (print bar)
          (let ((foo 2)
                (bar (+ foo 10)))
            (print foo)
            (print bar)
            (let* ((foo 3)
                   (bar (+ foo 10)))
              (print foo)
              (print bar))))
         
Erkläre die Ausgaben, die bei der Auswertung von `(verwirrung 42)' entstehen. Gib Symboltabellen für alle Ausdrücke an, die neue Bindungsumgebungen erzeugen.



Rekursion (2 + 3 Punkte)

Definiere eine zweistellige rekursive Funktion remove1(), die sich analog zur Common-Lisp Funktion remove() verhält, e.g.
? (remove1 'b '(a b c (a b) b))
(A C (A B))
Finde die entsprechende restrekursive Variante remove2().



Abgabetermin ist der 18-nov-1997

lisp-aufgaben@coli.uni-sb.de