A Nemerle programozási nyelv

Alprogramok, modulok



Szintaxis

Nemerlében minden alprogram egy függvény, melynek meghatározott visszatérési értéke van (eljárásoknál ez void). Ez beleilleszkedik a "minden utasítás egy kifejezés" elvbe. Függvények szintaxisa a következő:

<metódus_név>(<paraméterlista>) : <visszatérési_érték> { <kifejezés> };

Egy blokkon belül lehetőségünk van ún. lokális függvények deklarációjára is. Ezen függvények deklarációját a def kulcsszó vezeti be. A lokális függvények láthatósága csak az aktuális blokkon belül érvényes, a deklarációjuktól kezdve. Így lehetőségünk van lokális függvények egymásba ágyazására is (mivel a függvénytörzs is egy blokk). A lokális függvények élettartama hosszabb is lehet, mint a láthatóságuk, ugyanis értékül adhatjuk más függvénytípusú változóknak őket. Erre korábban a függvénytípusnál láthattunk példát.

A Nemerle lehetőséget nyújt a névtelen függvények, ún. "lambda-kifejezések" használatára is. Általánosságban a szintaxisuk:

fun (<paraméterlista>) : <visszatérési_érték> { <kifejezés> }

A típuskövetkeztetés miatt elhagyhatjuk a változók típusát is sok esetben. Erre mutat példát a következő forráskód:

def Execute(x, y, f) { f(x, y) }; def result = Execute(y = 3, x = 4, fun(a, b) { a+b });

Amint láthattuk ebben a példában, a nyelv támogatja a paraméterek név szerinti megfeleltetését is.

Paraméterátadás

A paraméterátadás módjai a következők lehetnek: érték szerinti (structnál, illetve primitív típusoknál alapértelmezett), referencia szerinti (objektumoknál alapértelmezett, primitív típusoknál, structnál "ref" kulcsszó), illetve eredmény szerinti (primitív típusoknál, structnál "out" kulcsszó).

Túlterhelés

A nyelvben lehetőség van a függvények, illetve bizonyos operátorok túlterhelésére. A szignatúrába csak a paraméterek számítanak bele, visszatérési értéket nem lehet túlterhelni. Lokális függvényeket viszont egyáltalán nem lehet túlterhelni, az újonnan deklarált ugyanazon nevű függvény szignatúrától függetlenül elfedi a régit. A típusokhoz új operátorokat is bevezethetünk, melyek nevét a @ karakterrel kell kezdeni, és static-ként kell deklarálni őket. A következő operátorokat nem lehet túlterhelni: &&, ||, %||, %&&, %^^, +=, -=, *=, /=, <<=, >>=, %=, |=, &=, ^=, <->, ::= .

Rekurzió

A nyelv funkcionális mivolta miatt nagy hangsúlyt fektet a rekurzióra. Rekurzív lokális függvényekkel sok helyen könnyedén ki lehet váltani az iteratív megoldásokat. Ha egy rekurzív lokális eljárás törzsében az utolsó kifejezés egy függvényhívás az eljárásra, ez esetben nem jön létre új verem keret az eljáráshíváshoz, ezt a Nemerle tail recursion-nek hívja (a függvényhívást pedig tail call-nak). Az egymást kölcsönösen meghívó lokális rekurzív függvényeknek külön szintaxisuk van:

f() : void { def a() { b(); } and b () { a(); } a(); }