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
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
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
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
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] ->[Boolean] >= [Character] ->[Boolean] <[Character] ->[Boolean] <= [Character] ->[Boolean] = [Character] ->[Boolean] != [Character] ->[Boolean] asString ->[String] getSignature -> [result: Sinature] create[Integer] ->[result:Character]
getSignature -> [result: Sinature] create -> [result: Condition]
getChar -> [Character] unGetChar [Character] getString -> [String] eos -> [Boolean]
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]
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]
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.
putChar[Character] putInt[n: Integer, width: Integer] putReal[Real] putString[String] flush close
+ [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]
getSignature -> [result: Sinature] create -> [result: SignatureType]
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] -> [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]
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]
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]
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]