JiML - Java interpreted ML

(english version)

Inhalt dieser Seite


Beschreibung

JiML ist eine funktionale Programmiersprache, welche vom Java Laufzeitsystem interpretiert wird.
Sie weist folgende Eigenschaften auf:


Syntax

Die folgende Syntax gibt nur Regeln an, nach denen der Interpreter die Anweisungen parst. Es gibt Ausdrücke, die bezüglich dieser Syntax korrekt sind, semantisch allerdings keinen Sinn machen.

JiML Anweisung --> Zuweisung ; |
Ausdruck ;
Zuweisung --> Bezeichner := Ausdruck
Ausdruck --> ( Ausdruck ) |
Bezeichner |
Integer Konstante |
Boolean Konstante |
Unit Konstante |
Binär Ausdruck |
Unär Ausdruck |
If Ausdruck |
Let local Ausdruck |
Abstraktion |
Applikation
Binär Ausdruck --> Ausdruck + Ausdruck |
Ausdruck - Ausdruck |
Ausdruck * Ausdruck |
Ausdruck / Ausdruck |
Ausdruck mod Ausdruck |
Ausdruck > Ausdruck |
Ausdruck < Ausdruck |
Ausdruck == Ausdruck |
Ausdruck <> Ausdruck |
Ausdruck and Ausdruck |
Ausdruck or Ausdruck
Unär Ausdruck --> neg Ausdruck |
not Ausdruck
If Ausdruck --> if Ausdruck then Ausdruck else Ausdruck endif
Let local Ausdruck --> let Zuweisung in Ausdruck local
Abstraktion --> func Bezeichner => Ausdruck |
funcrec Bezeichner => Ausdruck |
func Unit Konstante => Ausdruck |
funcrec Unit Konstante => Ausdruck
Applikation --> Ausdruck -> Ausdruck


Semantik

(Kommt noch)
Prioritäten und Assoziativitäten werden durch diese Operator- Vorrangtabelle bestimmt.


Entwicklungsecke (Theorie)

(Kommt noch)
Hier soll erklärt werden, wie JiML entwickelt und implementiert wurde. Ausserdem wird es hier eine Todo-Liste für zukünftige Versionen geben.

Todo


Code Beispiele


FAQ

Wo gibt es den JiML Interpreter?
Den JiML Interpreter gibt es verschiedenen Ausführungen:


Was bedeutet der Ausdruck (func x => func y => x+y)->5->8; und wie wird er ausgewertet?
Um diese Frage zu beantworten, sehen wir uns an wie dieser Ausdruck implizit geklammert ist. Man erkennt den Abstraktionsoperator => und den Applikationsoperator ->. Der Abstraktionsoperator ist rechtsassoziativ und der Applikationsoperator ist linksassoziativ, demnach entspricht dem oberen Ausdruck genau der folgende: ( (func x => (func y => x+y)) ->5)->8;
Aber ist dieser Ausdruck jetzt nicht komplizierter? Nein, wir können ihn jetzt in seine Bestandteile aufspalten. Zunächst wäre da der Teilausdruck func x =>(func y => x+y). Dieser Teilausdruck definiert zunächst eine Funktion. Diese Funktion hat ein einziges Argument x. Das Ergebnis dieser Funktion ist eine weitere Funktion. Diese Ergebnisfunktion hat wiederum ein einziges Argument y. Das Ergebnis dieser Ergebnisfunktion ist diesmal x+y. Das ganze ist also die Definition der Additionsfunktion in schöngefinkelter Form (curried-form). Wir geben diesem Gebilde nun den Namen add, um den restlichen Ausdruck zu vereinfachen. Von diesem bleibt nun nur noch (add->5)->8; übrig. Zunächst wird add->5 ausgewertet. Das ist die Anwendung der Funktion auf das Argument 5. Doch was war das Ergebnis dieser Funktion? Wir hatten herausgefunden, dass das Ergebnis dieser Funktion, eine weitere Funktion ist. Wir nennen diese nun add5 um den Rest wieder zu vereinfachen. Von diesem ist nur noch add5->8; übrig geblieben. Das ist nun also die Anwendung einer Funktion, welche 5 zu seinem Argument addiert. Angewandt wird sie auf 8 und somit wird 13 als Ergebnis zürückgegeben.
Das ganze hätte sich auch durch folgende Zeilen Code erkläen lassen:
add := (func x => (func y => x+y));
add5 := add->5;
ergebnis := add5->8;
ergebnis == (add->5)->8;


Kontakt

Für Fragen, Anmerkungen, sowie Vorschläge bin ich dankbar:
Fatih Coskun,
coskun@informatik.uni-muenchen.de.


Last modified: Oct 30 2003, webmaster