A Cayenne nyelv

Definíciók



Definíciók

Számos fejlesztések vannak a definíciók alapformájára a rekordokban.

Signatura definíciók
Haskell stílusú definíciók típus szignatúrával és egy definíció használható

defn ::= labelid :: type ; labelid = expr


Pl:
x :: Int; x = 5;
Függvény definíciók
Haskell stílusú függvény definíciók használhatók, amikor egy definíció jobb oldala egy lambda kifejezés a kötött változók balra mozdíthatók. Ha a szignatura jo a valtozók típusa elhagyható.

defn ::= labelid :: type ; labelid varid ... = expr

Pl:
inc :: Int->Int; inx x = x+1;
Függvény definíciók minta összehasonlitás által
Függvények definiálhatók minta összehasonlítással, mint a Haskellben. Helyettesító jelek is használhatók, '_'.

Pl:

not :: Bool -> Bool; not (False) = True; not (True) = False;

Minták a Cayenne-ban hasonlítanak a Haskell mintáira.

defn ::= labelid :: type ; labelid pat ... = expr
pat ::= _ | varid | varid@pat | (conid pat ... )

Típus definíciók
Típusok # definícióira van egy speciális rövidítés. A :: # rész elhagyható ha a kulcsszó type kitalálható a definícióból. Azonkívül, ha a type definíció argumentumának van típusa, akkor a# rész elhagyható.

defn ::= type labelid vardecl ... = type
vardecl ::= varid | ( varid :: type )


Pl:
type MyInt = Int; type PairX a = Pair a a;
Adat típus definíciók
Amikor adat típusokat definiálunk átlagos neveket szeretnénk adni a konstruktoroknak. Haskell stílusú adat típus definíció definiál egy típust és egy konstruktort egyidőben.

defn ::= data labelid vardecl ... = condef | ...

Pl:
data Bool = False | True;
iekvivalens
Bool :: # = data False | True; False :: Bool = False@Bool; True :: Bool = True@Bool;
Pl:
data List a = Nil | Cons a (List a);
ekvivalens
List :: # -> # = \ (a :: #) -> data Nil | Cons a (List a); Nil :: (a :: #) |-> List a = Nil@(List a); Cons :: (a :: #) |-> a -> List a -> List a = Cons@(List a);
Open definíció
Az open definíció kényelmes útról gondoskodik, hogy elérjük egy rekord néhány komponensét és lokálisan használjuk más rekordokon belül.

defn ::= open expr use [modifier] varid :: type [ = varid ], ... ;

A definíció
open e use i1::t1=i1', i2::t2=i2', ... ;
(szemantikailag) akvivalens a következővel
private i1::t1 = e.i1'; private i2::t2 = e.i2'; ...

Ha a második varid -t elhagyjuk ugyan azt szimulálja mint az első. A típusok elhagyhatók. Tehát csak annyi is elég, hogy
open e use i1, i2, ... ;

Az alap láthatósága private, de ez semmibe vehető akármelyik open definíció elejében, vagy egyénileg.

Kihagyható típus szignatúrák
Ha a definíció nem függvény definíció és nem rekurzív (vagy kölcsönös rekurzív csoport tagja) a típus szignatúra mindíg eldobható. Pl:
struct { x = 5; y = 7; }

Típus szignatúra kihagyható még, ha a rekordnak amiben a definició bekövetkezik van típus szignatúrája.