Funktionsdeklaration

Aktuell:

add is code( a,b as int ) := return a+b;

Ziel:

add( a, b as int ) = a+b;
f(x) = 2x+1;

Annahme: eine Funktion benötigt keine Klammern, sondern Argumente können per Komma oder Leerzeichen getrennt sein:

print "Hallo Welt";
v = vector 1 2 3;  // ruft vector::construct( a... )

Die Klammern legen ein Tuppel fest: ( 1, 2 ) ⇒ (int, int).

Eine Funktion kann nun mit den Parametern gerufen werden oder mit dem Tupel.

print "Hallo Welt";
print( "Hallo Welt" );

Eine Funktionsdeklaration beginnt mit einem unbekannten Identifier oder einem als Funktion bekannten Identifier, gefolgt von einer Öffnenen Klammer für den Beginn eines Tupels, gefolgt vom Tupel mit Datentypen oder Identifiern, abschließend mit runter schließender Klammer, gefolgt von einem = oder :=.

f(x) = 2x+1;

Möchte man, dass das x einen speziellen Typ hat, dann geht

f(x &  double:1)                   = 2x+1;
g(x & [double:1,int:1,string:"1"]) = 2x+1 as x\;
h(x & [string:"1",int:1], y & x )  = x+2y;
typelist = [string:"5",int:2];
i(x & typelist, y & typelist )     = x$+2y$;

x heißt der lokale Identifier, der entweder double sein muss und wenn er nicht angegeben ist, dann ist er als Default 1.

a = f(2 as int); // geht nicht.
b = f(2);        // b = 5.0 (double)
c = f();         // c = 3.0 (double)
d = g(2 as int); // d = 5;  (int)
e = g(2.0);      // e = 5.0 (double)
f2= g(int);      // f2= 3   (int)
g2= g("2");      // g2= "221" (string)
h2 = g(string);   // h = "111" (string)
i2 = f(x=default);// i = 3.0 (double);

j  = i(1,2)      // j=3
k  = i(1, "2")   // geht nicht, beide parameter müssen den gleichen Typ haben.
l  = i("5" as y);// l="155"

Die Funktion j akzeptiert je Parameter unterschiedliche Parameter, entsprechend der Liste in typelist.

Funktionsdeklarationen sind prinzipiell erstmal generisch und werden dann limitiert. Die Syntax & bezieht sich auf die Mengenoperation, dass die Deklaration in der Typeliste sein muss. Dabei darf bei einem einzelnen Typ, die Listen-Zeichen [] weggelassen werden.

Aufpassen

f is code(x) = 2x+1; // geht so
f  = code(x) = 2x+1; // geht so nicht mehr.