Egy absztrakt típus a mûveletek szigantúrájának csoportjaként van definiálva, ahol az egyes mûveletek szignatúrája tartalmazza a mûveletek nevét, a pareméterek és értékek nevét és típusát.
Minden típusobjektum exportál egy paraméter nélküli getSignature függvényt, amely visszatér egy elôredefiniált Signature típus objektumával. Más szavakkal, bármely objektum amely megfelel a következô típusnak:
immutable type aType function getSignature -> [Signature] end aTypeaz egy típus.
A típusok a típuskonstruktorok által jönnek létre. A típuskonstruktorok struktúrája a következô:
typeConstructor ::= [immutable] type typeIdentifier {operationSignature} end typeIdentifierAz azonosítók paraméter deklarációkban mellôzhetôek. A változtathatatlan típusból következi, hogy annak objektumai is változtathatatlanok, azaz ezen objektumok értékei nem változtathatók.
type Directory operation Add [name : String, thing : Any] operation Lookup [name : String] -> [thing : Any] operation Delete [name : String] end DirectoryEz a konstruktor végrehajtható és mikor végrehajtódik akkor létrehoz egy nem változtatható objektumot, mely illeszkedik az AbstractType-hoz. A getSignature végrehajtása az eredményül kapott objektumon önmagát adja vissza: egy típus 3 mûveletet igényel: Add, Lookup és Delete
Néhány típus a rendszerben kivétel a szabványos hasonlósági és egyezôségi szabályoknak. Hogy biztosak legyünk a helyességben az olyan típusoknak mint a Boolean, Condition, Node, Signature és Time a rendszer által implementáltnak kell lennie. A teljesítmény növelése érdekében Character, Integer, Real és String típusoknak is a rendszerben kell lenni implementálva.
Az Emerald 4 szintaktikai röviditést definiál az általánosan elõforduló szerkezetekre.
class ::= class identifier ["("baseClass")"][parameterlist] {classoperation} {declaration} [monitor|initially] {operation} [process] end identifier baseClass ::= identifier classoperation ::= class operationAz öröklõdés szintaktikus. Minden komponens az õs osztályban, ami nincs újradefiniálva a leszármazottban. Mivel bármely komponens újradefiniálható nincs garancia arra, hogy a leszármazott meg fog felelni az õ õsének.
enum ::= enumeration identifier enumIdentifier{"," enumIdentifier} end identifier
A felsorolási típus mûveletei: first, last, <, <=", ">, >=, =, !=, succ, pred, ord, asString. Mezõ
field ::= [attached] field identifier : type [initializer] | [attached] const field identifier : type initializer
Gyakran kényelmes, hogy kívülrõl elérhetõ adatelemet deklaráljunk az obejktumban. A mezõ deklaráció pontosan ezt csinálja. Mezõ delkaráció csak az objektum konstruktor deklarációs részében fordulhat elõ. Mindegyik mezõ deklaráció kiegészül egy változó deklarációval és két mûvelet definíciójával (elsõ esetben) vagy egy konstans deklarációra és egy mûvelet definícióra (második esetben)
A kibõvités így történik:
attached field a : b <- c is attached var a : b <- c export operation setA[x:b] a <- x end setA export function getA -> [x:b] x <- a end getAAhol az x azonosító úgy van választva, hogy ne ütközzön más azonosítóval.
Rekord
record ::= [immutable] record identifier field { field } end identifier; field ::= [attached] var fieldIdentifier : type Példa: immutable record aRecord var a : b var c : d end aRecord Osztályra kiterjesztve: immutable class aRecord[xa : b, xc : d] field a : b <- xa field c : d <- xc end aRecord
Az Emerald szintaktikusan megengedi, hogy elérjük a mezõket a rekordhoz hasonló objektumokban.
A szintaktikai formája:
filedSelection ::= expression "$" identifier subscript ::= expression "[" expression { "," expression } "]"