A Fables programozási nyelv

Alprogramok, modulok

Szintaxis

Modellek

Modelleket egyszerű szöveges állományokban definiálhatunk, .fab kiterjesztésekkel.

Modelleket a következő formában definiálhatunk:

model <ModelName> ; // ... end;

Az egyes modellekben definiálhatjuk saját eljárásainkat, függvényeinket, az ütemezéseket, az ágenseket reprezentáló osztályokat. Ezeket mind a fent jelzett kulcsszavak között tehetjük meg.

Elsődleges függvénydefiníció

A függvények olyan kódrészletek, amelyek a program bármely részéből hivatkozhatóak. A függvényekkel írhatjuk le a modell ill. a modell és az ágensek közötti relációkat. A függvényeket Curry-formában lehet megadni, azonban a paraméter lehet egy rendezett n-es (tupple) is, így tetszőleges számú paramétert meg lehet adni.

A függvénydefiníciók általános formája a következő:

FunctionName ( <parameter list> ) = <expression> ;

Példák:

negate(x) = -x ; discriminant(a, b, c) = b*b – 4*a*c ; distance(a1, a2, b1, b2) = (a1-a2)^2 + (b1-b2)^2 ;

A paramétereket egy vesszővel ellátott listában írhatjuk le. Ha nincs egyetlen paraméter sem, akkor a függvény zárójeleit sem kötelező kirakni.

Példák:

twoontwo = 2^2 ; coinflip = discreteUniform( ["head","tails"] ) ;
size1  = 25 ; // Ezek a definíciók ekvivalensek size2() = 25 ;

A definíciók alapján bevezetett nevek elsődleges függvénydefinícióknak minősülnek – Fables-ben a függvények felsőbb osztályú elemek.

Lokális definíciók

Minden egyes függvénydefiníció rendelkezhet lokális definíciókkal (tetszőleges mélységben), amelyek csak az adott függvényre vonatkoznak.

A lokális definíciókat a függvény definíciója után írt where kulcsszóval definiálhatunk egy zárójelben, egymástól vesszővel elválasztva. Az általános formája a következő:

FunctionName ( <parameter list> ) = <expression> where ( <local-definition>, <local-definition>,... );

Példa:

// Feltéve, hogy a!=0 és a diszkrimináns pozitív quadraticEquation1(a, b, c) = a^2–sqrt(D) where ( D = b^2 – 4*a*c );

A lokális definíciók azonban rövidítésekre is használhatók, például:

act(x) = 2*p(x) where ( p(y) = previousValue(y) );

Paraméterátadás

Kidolgozásra vár.

Túlterhelés

Kidolgozásra vár.

Rekurzió

Rekurzió különösebb megkötés nélkül megengedett. Egy komolyabb példa a Fibonacci-számok előállítására:

fib(n) = lfib(n).2            where (              lfib(n) = n==0 or n==1 => (1,1)                        otherwise shift(lfib(n-1))                      where (                        shift(t)=eval (t.2,t.1+t.2)                      )            )