A Joyce programozási nyelv

Típusok

Minden konstansnak, változónak, kifejezésnek egyértelműen meghatározható típusa van. Egy operandus típusa azon lehetséges értékek halmaza, amely az operandushoz rendelhető.

Típus definíciók

TypeDefinitionPart = "type" TypeDefinition { TypeDefinition }.
TypeDefinition = TypeName "=" NewType ";".
TypeName = Name.
NewType = EnumeratedType | StructuredType.

A következő Típusdefiníció:
T = NT;
bevezeti a T jelölést az NT új típusra, amely az összes többi típustól különbözni fog.

Példák:

type task = (log, flow, scan); table = array [1..n] of integer; str = array [1..80] of char; buffer = record; contents: table; head, tail, length: integer end; stream = [int(integer), eos];

Egyszerű típusok

Egy egyszerű típus egy véges, rendezett értékkészlet (elemei: egyszerű értékek). Az egyszerű típusok: egész, logikai, karakter és felsorolási típusok. Egy egyszerű típus értékei leképezhetőek bijektív módon az egész számok egymást követő számokból álló részhalmazára. Ezen részhalmaz elemeit ordinális számoknak nevezzük. Egy egyszerű értékhez tartozó ordinális számot így jelöljük:

integer(x)

Egész típus:

Az integer típusnév az egész számoknak egy rendszerfüggő intervallumát jelöli. Az x egészhez tartozó ordinális szám önmaga, azaz
integer(x) = x

Logikai típus:

A boolean típusnév az igaz (true) és hamis (false) igazságértékeket jelöli.Az ezekhez tartozó ordinális számok:
integer(false) = 0 integer(true) = 1

Karakter típus:

A char típusnév az ASCII karakterkészletet jelöli.

Felsorolási típusok

EnumeratedType = "(" ConstantName { "," ConstantName } ")".
ConstantName = Name.

A következõ típusdefiníció:
T = (c0, c1, ..., cn);
egy T-nek nevezett felsorolási típust definiál. A típus bevezeti a c0, c1,..., cn konstans neveket a T értekeinek jelölésére.
Ezen értékekhez tartozó ordinális számok:
integer(c0) = 0 integer(c1) = 1 ... integer(cn) = n

Példa:

(log, flow, scan)

Valós típus:
A real típusnév a valós számoknak egy rendszerfüggő részhalmazát jelöli. Egy valós kifejezés eredménye a megfelelő matematikai kifejezés rendszerfüggő közelítése lesz.

Összetett típusok

StructuredType = ArrayType | RecordType | PortType.
Egy T összetett típust más típusok felhasználásával definiálunk.

Vektor típus

ArrayType = "array" "[" IndexRange "]" "of" ElementType.
IndexRange = LowerBound ".." UpperBound.
LowerBound = SimpleConstant.
UpperBound = SimpleConstant.
ElementType = TypeName.

A következõ típus definíció:
T = array [min..max] of E;
egy T-nek nevezett vektor típust definiál. Ennek a típusnak minden értéke E értékeinek egy max - min + 1 hosszú sorozata. Ezen sorozat hossza a vektor |T| hossza. A sorozat elemeit vektor elemeknek nevezzük. Minden vektor elemnek van egy indexe, amely a vektor értékben meghatározott pozícióját adja meg. Ezen indexek rendre
min, min+1, ... , max
Tehát egy T típusú változó egy E típusú |T| hosszú sorozatot reprezentál. Az index intervallumot két konstanssal kell definiálni (min, max), melyeknek a típusa meg kell, hogy egyezzen, továbbá hogy fennálljon: min <= max. E egy ismert típusnak a neve kell, hogy legyen.
Azt a vektor típust, amelyben az elemek típusa karakter, sztring típusnak nevezzük. Egy sztring típus konkrét értékeit sztringeknek nevezzük, mely értékek egy rendezett halmazt alkotnak. Minden más vektor típus értékei rendezetlen halmazt alkotnak.

Példák

array [1..n] of integer array [1..80] of char

Rekord típusok

RecordType = "record" FieldList "end".
FieldList = RecordSection { ";" RecordSection }.
RecordSection = FieldName { "," FieldName } ":" FieldType.
FieldName = Name.
FieldType = TypeName.

A következõ típus definíció:
T = record f1:T1; f2:T2; ... fn:Tn end;
Egy T rekord típust definiál. Minden rekord érték n érték sorozata, melyeket mezőknek nevezünk. A mezőket fi-knek nevezzük, mely egyértelműen meghatározza a mező helyét a rekordban, a mező értéke pedig Ti típusú lesz. A rekord típus minden olyan értéket magában foglal, melyben egy T1 típusú értéket egy T2 típusú követ, stb. egészen a záró Tn típusú értékig. A rekord értékek rendezetlenek. Az f1, f2, ... , fn mező neveknek különbözőeknek; a T1, T2, ... , Tn -nek pedig ismert típusneveknek kell lenniük.
A rekord definíciójában a következő sor
f1, f2, ..., fj: Tk
azt jelenti, hogy az f1, f2, ..., fj mezőknek ugyanaz a Tk a típusa.

Példa:
record contents: table; head, tail, length: integer end
Port típus

PortType = "[" Alphabet "]" .
Alphabet = SymbolClass { "." SymbolClass } .
SymbolClass = SymbolName [ "(" MessageType ")" ] .
SymbolName = Name .
MessageType = TypeName .

Az ágensek szimbólumnak nevezett értékekkel kommunikálnak, melyeket ún. csatornákon keresztül továbbítanak egymásnak. Az egy csatornán továbbítható lehetséges szimbólumok halmazát a csatorna ABC-jének nevezzük. Az ágensek a csatornákat dinamikusan hozzák létre, és ún. port változókon keresztül érik el azokat. Az ilyen változok típusát nevezzük port típusnak. A következő típus definíció
T = [s1(T1), s2(T2), ..., sn(Tn)];
egy T-nek nevezett portot definiál. A nil T port érték T típusú, és a nem létező csatornát jelöli. Minden egyéb T típusú port érték különböző csatornákat jelöl az adott ABC-vel. A port értékek (más néven csatorna pointerek) rendezetlenek.
Az ABC az s1, s2, ..., sn nevű n db diszjunkt szimbólum osztály uniója.
Az
si(ti)
szimbólum osztály a következő: a Ti típus minden lehetséges értekei az si névvel prefixelve. A Ti értékeket üzeneteknek nevezzük.
A következő szimbólum osztály: sj
az egyetlen üzenet nélküli sj szimbólumból áll. Az ilyen szimbólumot jelzésnek nevezzük. Az s1, s2, ..., sn szimbólum neveknek különbözniük kell egymástól, és T1, T2, ..., Tn-nek ismert típusok neveinek kell lenniük. Az üzenetek típusa nem lehet port típus (és nem is tartalmazhat port típust).

Példa
[int(integer), eos]