Az Emerald programozási nyelv

Beépített típusok

Típusnév			Típus meghatározás
		
Type				deklarációkban, mint típus használatos
Any				nincs egy művelete se
Array				poliformikus, rugalmas tömb
BitChunk			bitszelet bitenkénti logikai műveletekkel
Boolean				logikai értékek a true és a false literállal
Character			karakterek a > , < , =, ord, ? operációkkal
Condition			feltételes változók, mik kielégítik a Hoare berendezés szemantikáját
ImmutableVector			csak olvasható vektor
InStream			bemeneti file típusa
Integer				előjeles integer
Node				gépet reprezentáló objektumok 
NodeList			node leírások csak olvasható vektora
NodeListElement			csak olvasható node leírások
None				a nil típusa
OutStream			kimeneti file típusa
Real				lebegőpontos valós szám
Signature			primitív absztrakt típus
String				karakter sorozat
Time				idő és dátum
Vector				rögzített hosszú polimorfikus vektor
ConcreteType			figyelmen kívül hagyható kód
VectorOfChar			karakterekből álló vektor

Beépített típusok műveletei

AbstractType

Az AbstractType és a Signature objektumok közösen meghatározzák egy típusnak a koncepcióját. A Signature leírja az alapot, ezzel egy típuskonstruktort eredményezve és engedélyezi, hogy más objektumok implementálják. (A Signature objektum később lesz.)

const AbstractType == immutable object AbstractType
	export getSignature
	const AbstractTypeSignature == immutable type AbstractTypeSignature
		function getSignature ->[Signature]
	end AbstractTypeSignature

	function getSignature -> [result: Signature]
		result <- AbstractTypeSignature
	end getSignature
end AbstractType

Any

Az any-nek nincs egy művelete se, ez minden Emerald objektum őse.

const Any == immutable object Any
	export getSignature

	const AnyType == type AnyType
		% no operation
	end AnyType

	function getSignature -> [result : Signature]
		result <- AnyType
	end getSignature
end Any

Array

Az array egy kifejezhető és indexelhető tárolót implementál. Az array-en az of operáció egy AbstactType-ot igényel, és egy tömb létrehozásával tér vissza. Az array-t lehet kiterjeszteni és rövidíteni, ezért egyszerű adattípusok implementálhatók az array segítségével, úgy mint sorok és vermek. A verem az addUpper és removeUpper műveleteket használja, míg a sor az AddUpper és RemoveLower műveleteket.
Műveletei:

getElement[Integer]->[ElementType]	elemlekérdezés
setElement[Integer, ElementType]	értékadás
upperBound->[Integer]			felső index
lowerBound->[Integer]			alsó index
getSlice[Integer, Integer]->[NA]		a tömb egy szelete
slideTo[Integer]			csúsztatás
addUpper[ElementType]			hozzáír a legvégére
removeUpper-> [ElementType]		leveszi a legvégéről
addLower[ElementType]			hozzáír a legelejére
removeLower->[ElementType]		elvesz a legelejéről
empty->[Boolean]				üres-e
catenate[a: NA]- >[r: NA]	
getSignature->[Signature]	
empty->[NA]				üreset hoz létre
literal[Vector.of[ElementType]] ->[NA]	vektorból tömböt hoz létre
create[Integer] ->[NA]			megadott hosszú tömböt hoz létre

Boolean

Továbbá a felsorolt Boolean műveletek és a Boolean részt vesznek a feltételes és és vagy kifejezésekben. Ezek a feltételes műveletek nem írhatók le a Boolean műveletek feltételeivel, mert ez magába foglalná a kiértékelését a műveletek argumentumainak, és pont ez az, amit a feltételes kifejezések el akarnak kerülni.
Műveletei:

> [Boolean]->[Boolean]
>= [Boolean]->[Boolean]
<[Boolean]->[Boolean]
<= [Boolean]->[Boolean]
= [Boolean]->[Boolean]
!= [Boolean]->[Boolean]
& [Boolean]->[Boolean]
| [Boolean]->[Boolean]
! [Boolean] ->[Boolean]
asString ->[String]
getSignature -> [result: Sinature]
makeTrue ->[result: Boolean]
makeFalse ->[result: Boolean]

Character

Karakter.
Műveletei:
> [Character] ->[Boolean]
>= [Character] ->[Boolean]
<[Character] ->[Boolean]
<= [Character] ->[Boolean]
= [Character] ->[Boolean]
!= [Character] ->[Boolean]
asString ->[String]
getSignature -> [result: Sinature]
create[Integer] ->[result:Character]

Condition

A Hoare állapot változóinak formulái az objektumok feltétel kikötéseiben nem eléggé kielégítőek. A condition objektum ott használható, ahol az először használt monitor, és figyelmetlen ott, ahol a condition meg van írva. Műveletei:
getSignature -> [result: Sinature]
 create -> [result: Condition]

Instream

Az Instream az olvasandó file-okkal való dolgozást támogatja. Az Instream objektum megváltoztathatatlan . Műveletei:
getChar -> [Character]
unGetChar [Character]
getString -> [String]
eos -> [Boolean]

Integer

Az integer és a real közötti átváltás az asReal művelettel lehetséges az Integer-eken, és asInteger művelettel a Real-eken. Egy Integer Real-ként nem működik. (mivel a Real-eket csak Real-ekkel lehet megvalósítani). Nincs konverzió, mert a látszata változik a kifejezés típusának anélkül, hogy változna a reprezentációja, amíg az érték konverzióban a reprezentációnak is változnia kell ugyanúgy, mint a típusnak.
Műveletek:

+ [Integer] -> [Integer]
- [Integer] -> [Integer]
* [Integer] -> [Integer]
/ [Integer] -> [Integer]
# [Integer] -> [Integer]
> [Integer] -> [Boolean]
>= [Integer] -> [Boolean]
<[Integer] -> [Boolean]
<= [Integer] -> [Boolean]
= [Integer] -> [Boolean]
!= [Integer] -> [Boolean]
~ [Integer] -> [Integer]
asString -> [String]
asReal -> [Real]
getSignature  -> [result: Signature]
create [rep:String] -> [result: Integer]

Node, NodeList, NodeListElement

Számos művelet van implementálva a Node-okkal. A NodeEventHandler engedélyezi, hogy meghívódjanak a megfelelő műveletek, mikor a Node változást észlel a hálózati topológiában. A műveletek, amelyek lekérdezik a hálózati topológiát, azok a NodeList és NodeListElement segédtípusokat használják.
Műveletei:

getActiveNodes -> [NodeList]
getAllNodes -> [NodeList]
getNodeInformation -> [NodeListElement]
getTimeOfDay -> [Time]
delay[Time]
waitUntil[Time]
getLoadAverage -> [Real]
setNodeEventHandler[HandlerType]
removeNodeEventHandler[HandlerType]
getStdin -> [Instream]
getStdout -> [OutStream]
getLNN -> [Integer]
getName -> [String]
getSignature -> [result: Signature]
create ->[result: Node]
NodeListElement műveletei:
getTheNode -> [Node]
getUp -> [Boolean]
getIncarnationTime -> [Time]
getLNN -> [Integer]
NodeList műveletei:
nodeUp [Node, Time]
nodeDown [Node, Time]

None

A None az a típus, amely minden műveletet támogat, és ezért csak a nil objektummal implementáljuk. Ez azért van definiálva, hogy teljessé tegye az Emerald típusok roststruktúráját. A Node a típusrost legfelső elemét reprezentálja.

OutStream

Az OutStream egy kimeneti file-t reprezentál.
Műveletei:
putChar[Character]
putInt[n: Integer, width: Integer]
putReal[Real]
putString[String]
flush
close

Real

A Real 32 bites lebegőpontos szám tárolására alkalmas.
Műveletei:
+ [Real] -> [Real]
- [Real] -> [Real]
* [Real] -> [Real]
/ [Real] -> [Real]
> [Real] -> [Boolean]
>= [Real] -> [Boolean]
<[Real] -> [Boolean]
<= [Real] -> [Boolean]
= [Real] -> [Boolean]
!= [Real] -> [Boolean]
~  -> [Real]
asString -> [String]
asInteger -> [Integer]
getSignature  -> [result: Signature]
create [rep:String] -> [result: Real]

Signature

Engedélyezi az Emerald típusainak teljes definiálását. Ld. még az AbstractType-nál.
Műveletei:
getSignature -> [result: Sinature]
create -> [result: SignatureType]

String

A || művelet string-eken egy új string-gel tér vissza, ami a két argumentum konkatenációja. A getSlice művelet egy új stringet ad vissza, ami része az eredeti stringnek, mely a megadott indextől (0) kezdődik és megadott hosszú.
Műveletek:

getElement[Integer] -> [Character]
getSlice[lb: Integer, length: Integer] -> [String]
length -> [Integer]
|| [String] -> [String]
> [String] -> [Boolean]
>= [String] -> [Boolean]
<[String] -> [Boolean]
<= [String] -> [Boolean]
= [String] -> [Boolean]
!= [String] -> [Boolean]
getSignature -> [result: Sinature]

Time

Időt és dátumot reprezentál.
Műveletek:
+ [Time] -> [Time]
- [Time] -> [Time]
* [Integer] -> [Time]
/ [Integer] -> [Time]
> [Time] -> [Boolean]
>= [Time] -> [Boolean]
<[Time] -> [Boolean]
<= [Time] -> [Boolean]
= [Time] -> [Boolean]
!= [Time] -> [Boolean]
getSeconds -> [Integer]
getMicroSeconds -> [Integer]
asString -> [String]
asDate -> [String]
getSignature -> [result: Sinature]
create[rep: Any] -> [result: Time]

Vector

A vektornak két fajtája van: módosítható és nem módosítható.
A Vector annak az objektumnak a neve, amelyik sokoldalú műveletekkel rendelkezik, amik módosítható vektorokat hoznak létre. Az ImmutableVector annak az objektumnak a neve, amelyek nem módosítható vektorokat hoznak létre. A Vektorok a legegyszerűbb megoldást biztosítják az indexelhető tárolónak. Az Array beépített objektum maradéktalanul az Emeraldban van, a vektor lehetőségeit kihasználva.
Műveletei:

getElement [Integer] -> [ElementType]
setElement [Integer, ElementType]
upperbound -> [Integer]
lowerbound -> [Integer]
getSlice[Integer,Integer] -> [NV]
create [Integer] -> [NV]
getSignature -> [Sinature]

ImmutableVector

Az ImmutableVector annak az objektumnak a neve, amelyek nem módosítható vektorokat hoznak létre. A Vector pedig annak az objektumnak a neve, amely módosítható vektorokat hoz létre.
Az ImmutableVector elsődleges funkciója, hogy a Vector literálokat megvalósítsa a nyelvben, de ezek akkor is elérhetők, amikor csak olvasásra szükségesek.
Műveletei:

getElement [Integer] -> [ElementType]
upperbound -> [Integer]
lowerbound -> [Integer]
getSlice[Integer,Integer] -> [NV]
create [Integer] -> [NV]
getSignature -> [Sinature]

BitChunk

A BitChunk tetszőleges hosszúságú bitsorozaton engedélyez műveletet. Műveletek vannak a bitek csoportjának átállítására és kiolvasására tetszőleges pozícióban maximum 32 bit hosszan.
Műveletei:

Create [n: Integer] -> [BitChunk]
getSigned [off: Integer, len: Integer] -> [Integer]
getUnSigned [Integer, Integer] -> [Integer]
getElement [Integer,Integer] -> [Integer]
setSigned [off: Integer, len: Integer, val: Integer]
setUnsigned [Integer, Integer, Integer]
setElement [Integer, Integer, Integer]
ntoh [integer, Integer]

VectorOfChar

Ugyanaz, mint a Vector.of[Character] (karakterekből álló vektor)