#include "head.html"

Lokale Deklaration von Variablen

Wir wollen den arithmetischen Interpreter erweitern. Wir gestatten lokale Deklarationen der Form let { x = 3 * 4 ; y = 7 } in ( x - y ).

Abstrakte Syntax festlegen

Wir müssen dafür den passenden Syntaxtyp definieren
#include "../src/Let_Type.hs"

Abstrakte Syntax anzeigen

Wir wollen uns die Syntaxbäume auch anschauen, dazu erzeugen wir einen Rose-Tree und zeichnen diesen wie gehabt
#include "../src/Let_Form.hs"

Konkrete Syntax festlegen

Wir erweitern auch den Parser durch Hinzufügen eines Teil-Parsers für Bindungen:
atom :: Parser Term
atom =    do n <- natural
	     return $ Constant n
   `plus` paren term
   `plus` bindung
   `plus` do n <- name
	     return $ Var n

bindung :: Parser Term
bindung = do
    keyword "let"
    nts <- brace $ sepBy (operator ";")
		 $ do n <- name
		      operator "="
		      t <- term	
		      return (n, t)
    keyword "in"
    body <- term
    return $ Let nts body
(kompletter Quelltext hier)

Semantik

Wir erweitern auch die Semantik-Funktion. Jetzt kann ja der Fall eintreten, daß wir den Wert einer Variablen benötigen. Diese Werte bewahren wir in einer Umgebung auf.
#include "../src/Env.hs"
Tatsächlich benutzen wir Listen von Umgebungen, und verwenden jeweils die erste sichtbare Bindung.

Das Auswerten eines Ausdrucks geht dann so:

#include "../src/Let_Eval.hs"
Das packen wir noch in ein Hauptprogramm
#include "../src/Let_Main.hs"

Wie weiter?

Als nächstes wünschen wir uns lokale Definitionen von Funktionen. #include "foot.html"