zu www.bildungsgueter.de zur Inhaltsübersicht des Kapitels

LISP - Implementierungshinweise

Implementierung der Funktion ERRORSET


Die Funktion ERRORSET nimmt eine Son­der­stel­lung ein, weil sie festlegt, wo die Pro­gramm­ausfüh­rung nach dem Auf­tre­ten eines Fehlers fort­ge­setzt werden soll. Die folgenden Beispiele verdeutlichen die Bedeutung dieser Feststellung.

1. Beispiel



2. Beispiel



....

Das Aufrufsegment von ERRORSET ist jenes Segment, in das zurückgekehrt werden muss, wenn bei der zweiten Er­ar­bei­tung des ersten Arguments von ERRORSET ein Fehler auftritt. Alle im Keller über diesem Segment liegenden Auf­ruf­seg­men­te sind aus dem Keller zu entfernen.

Für die sofortige Rückkehr in ein bestimmtes Aufrufsegment wird eine selten verwendete Technik verwendet, die eine lokal vereinbarte Prozedur mit einem Sprungbefehl kombiniert. Das Ziel des Sprung­befehls ist eine Marke, die im gleichen Ver­ein­ba­rungs­bereich steht wie die lokal ver­ein­bar­te Prozedur:

{
}
procedure errorset (arg : reference;
                    showErrorMessage : boolean;
                    var res : reference);
  label 9;
  var localStack : reference;
  procedure errorHandler (errorID : errorCode);
  begin
    if showErrorMessage then reportError(errorID);
    reduceStackTo(localStack);
    goto 9;
  end;
begin
  res := 0;
  localStack := stack;
  evaluate(arg, res, errorHandler);
  res := cons(res, 0);
  9:
end;

Besser (Hier wird das Paar, das das Ergebnis aufnehmen soll, vor der Auswertung des geschützten Ausdrucks bereit­ge­stellt. Eine wirkliche Verbesserung ist das allerdings nicht.)

{
}
procedure errorset (arg : reference;
                    showErrorMessage : boolean;
                    var res : reference);
  label 9;
  var localStack : reference;
  procedure errorHandler (errorID : errorCode);
  begin
    if showErrorMessage then reportError(errorID);
    reduceStackTo(localStack);
    res := 0;
    goto 99;
  end;
begin
  res := 0;
  localStack := stack;
  res := cons(0, 0);
  evaluate(arg, pairs[res].car, errorHandler);
  9:
end;

zur Inhaltsübersicht des Kapitels