Claire

Alprogramok, modulok

Alprogramok

A Claire-ben a metódusok kétfélék lehetnek, függvények vagy eljárások. A függvények szintaxisa:

<selector>(<typed parameters>): <range> -> | => <body>

Az eljárások szintaxisa:

<selector>(<typed parameters>): -> | => <body>

Példák:

fact(n:{0}) : integer -> 1 fact(n:integer) : integer -> (n * fact(n - 1)) print_test() -> print("Hello"), print("world\n")

A Claire támogatja a változó számú argumentumokat a listargs kulcsszó segítségével. Az argumentumokat egy listába rakja. Például:

f(x:integer,y:listargs) -> x + size(y)

Ekkor az f(1,2,3,4) függvényhíváskor az x=1 és az y=list(2,3,4) lesz, s 4-el tér vissza a függvény.

Ugyancsak hasznos dolog, hogy a függvények több értékkel is visszatérhetnek a tuple segítségével. Ha egy olyan funkcióra van szükség, amely a v1,v2,...,vn értékekkel tér vissza a t1,t2,...,tn típusokkal, akkor egyszerűen a függvény visszatérési értékét tuple(t1,t2,...,tn)-nek deklaráljuk, és a tuple(v1,v2,...,vn) értékkel térünk vissza.

Használhatunk külső funkciókat is, azaz beimportálhatunk C/C++ függvényeket a Claire-be. Ez a function!(...) kontstruktorral lehetséges. Például:

f(x:integer,y:integer) -> function!(my_version_of_f)

Itt jegyezzük meg, hogy a Claire csak legfejlebb 12 paramétert enged meg a függvényekben, s ezért a több mint 40 paraméteres függvények beimportálása a C++ egyes könyvtáraiból igen nehéz feladat. Tanácsos paraméter objektumokat használni ez esetben.

A Claire az inline metódusokat is támogatja, ennek használatakor kell a -> helyett =>-t írni a függvény törzse elé. Az inline metódus a szokásos módon viselkedik, az egyetlen különbség, hogy a fordító a kódban a funkció hívás helyett in-line helyettesítést fog elvégezni, ha ez helyénvaló. Az inline metódusok többalakú makrók, s egészen hathatós kódot eredményeznek.

A Claire-ben a két argumentumú függvényeket kétféle módon is írhatjuk, f(...) és (... f ...) formában. Ha az infix formáját akarjuk használni egy függénynek, akkor azt a következőképpen tehetjük meg:

f :: operation()

Később a hagyományos módon adhatjuk meg a jelentését a függvénynek. De ha már megadtuk a jelentését, utána már nem mondhatjuk, hogy infix legyen, csakis előtte. A függvénynek megadhatjuk a precedenciáját is, mint azt a következő példában láthatjuk:

gcd :: operation(precedence = precedence(/)) 12 + 3 gcd 4 ;; megfelel 12 + (3 gcd 4)-nek