Az Eiffel nyelv tervezésekor lényeges szempont volt az, hogy az utasításkészlet minél egyszerűbb, áttekinthetőbb és kompaktabb legyen. Ennek érdekében például kihagyták a nyelvből a szekvencia kötelező jelölését és a blokkstruktúrát. Rövid, könnyen megjegyezhető kulcsszavakat vezettek be, csak a legszükségesebb funkciókra. Amit lehetett, a nyelv utasításkészletén kívül, a library-rendszerben helyeztek el. (Ld. még szabványos könyvtárak.)
A szekvencia Eiffelben egyszerűen úgy kódolható, hogy a tagjait egymás után írjuk pontosvesszővel elválasztva. Elhatároló kulcsszavakra, mint például a begin és az end a Pascal-ban, nincs szükség. A szekvencia állhat 0 tagból is, ekkor üres utasítást jelent. A szintaxis úgy van megtervezve, hogy a pontosvesszők akár el is hagyhatók, de használatuk ajánlott. Ha használjuk a pontosvesszőt, akkor az a Wirth féle nyelvekhez hasonlóan utasítás elválasztóként működik, és nem utasítást lezáró szimbólumként.
Compound
nulla utasítást tartalmaz, akkor a számítás terének állapota változatlan marad. Ha a Compound
1 vagy több utasítást tartalmaz, hatása az, hogy végrehajtódik az első utasítása, majd rekurzív módon az a Compound
, amit az előzőből az első utasítás elhagyásával kapunk. Vagyis amilyen sorrendben megjelennek az utasítások, végrehajtjuk őket.
Nem jelenik meg a szintaxisban. Hatása: a számítás terének állapota változatlan marad. Szerepe, hogy a fölösleges zárójelekből ne legyen baj.
A többi modern programozási nyelvhez hasonlóan az Eiffelben is kétféle elágazás utasítás van.
Az egyik az if
utasítás, ami tetszőleges elágazás kódolására alkalmas.
Példa:
elseif
és else
részek természetesen opcionálisak. Az utasítás szemantikája ugyanaz, mint az Ada nyelv if
utasításáé.
A másik a többirányú elágazás (inspect
), ami leginkább a Modula-2 case
utasításához hasonlít. Egy INTEGER
vagy CHARACTER
típusú kifejezés értékét lehet vele összehasonlítani megfelelő típusú konstansokkal, és egyezés esetén egy utasítássorozatot végrehajtani.
Példa:
inspect
utasítás ágaiban nem csak különálló konstansok, hanem intervallumok és felsorolás is szerepelhetnek. Az ágaknak diszjunktaknak kell lennie, a bennük szereplő konstansok típusának szigorúan meg kell egyezni a vizsgált kifejezés típusával. Az else
rész itt is elmaradhat, de ha a vizsgált kifejezés értéke nem egyezik meg egyik konstans értékével sem, tehát a megadott konstansok nem fedik le a teljes értéktartományt, akkor kivétel váltódik ki (a kódja invalid_inspect_value
). (Ld. még kivételkezelés.)
Eiffel-ben ugyan nem létezik felsorolási típus, mégis adódik egy lehetőség a helyettesítésére: a unique
attribútumok fogalma.
unique
konstanst ugyanabban az osztályban kell bevezetni (különben nem biztos, hogy különbözőek az értékek), és ha nem csak unique
-ot vizsgálunk, akkor az negatív vagy 0 kell legyen, hogy biztosan ne essen egybe egyikkel sem.
A szemantika leíráshoz bevezetjük az ún. "feloldott formát". Ez azt jelenti, hogy úgy tekint minden intervallumot, mintha minden benne szereplő érték fel lenne sorolva. Pl.:
inspect
kifejezés INTEGER
vagy CHARACTER
típusú.
inspect
konstansok (a különböző választék részben az értékek) ugyanolyan típusú konstansok, mint az inspect
kifejezés.
unique inspect
konstansnak különböző az értéke.
unique inspect
konstansnak különböző az neve.
inspect
konstans unique
, akkor az összes többi is vagy unique
, vagy negatív, vagy 0 értéke van.
inspect
kifejezés értékét. Ez legfeljebb egy inspect
konstanssal lehet egyenlő az előző kikötések miatt. Ha van ilyen, akkor a megfelelő inspect
konstans when
-je után következő Compound
-ot hajtja végre. Ha nincs, akkor:
else
ág, azt hajtja végre.
else
ág, exception-t vált ki (a Kernel Library EXCEPTIONS
osztályából az invalid_inspect_value
-t), és a rutin végrehajtás abbamarad. else
ágat, ha a feltételek egyike sem teljesül. A feltételes utasítás ilyenkor egy üres utasítást hajt végre, de a többirányú elágazás exception-t vált ki. Ennek oka az utasítások természetéből adódik: egy feltételes utasítás sorban kipróbálja a lehetőségek egy sorozatát, míg valamelyik esetleg bekövetkezik. Egy többirányú elágazás összehasonlítja egy fix konstans-halmazzal, és ha nem egyezik meg az egyikkel ezek közül, akkor az else
ágat hajtja végre. Ezért lehet else
-t üresen is írni, de ha nem írok, azt jelenti, hogy meg vagyok győződve arról, hogy az érték beleesik valamelyik ágba. Ha mégsem - akkor exception.
Más nyelvekből is ismerünk egy case
vagy switch
utasítást. De vigyázzunk, hogy nehogy rosszul használjuk az Eiffelben!
Amikor egy rendszernek arra van szüksége, hogy számos lehetséges tevékenység közül kiválasszon egyet, a megfelelő technika nagyon gyakran nem az, hogy explicite beteszteljük az összes lehetséges esetet, hanem egy sokkal rugalmasabb, öröklődésen alapuló technika: a dinamikus összekapcsolás. Az explicit teszteknél minden lehetséges választást fel kell tüntetni - ez egy veszélyes gyakorlat, hiszen egy software project kifejlesztése során mindenképpen lesznek olyan lehetőségek, amelyeket vagy hozzá kell vegyünk, vagy el kell vegyünk belőle. A dinamikus összekapcsolás segít elkerülni ezt. A többirányú elágazás használatát csak olyan egyszerű esetekre kell fenntartani, ahol egy - egyetlen - művelet egy fix és jól ismert választék halmazától függ, amelyek karakterenként vagy egészként reprezentálhatóak.
Ha a választék egy adattípus variánsait reprezentálja (pl. alkalmazottak különböző kategóriáit, ahol pl. a fizetést másképp kell kiszámítani), akkor a többirányú elágazás nem megfelelő - ekkor ehelyett inkább különböző osztályokat kell definiálni, amelyek egy közös őstől örökölnek (pl. MANAGER, ENGINEER
stb. az EMPLOYEE
) és egy vagy több jellemzőt újradefiniálni ( mint pl. a pay_salary
), a lokális kontextusnak megfelelően. És akkor a dinamikus összekapcsolás fogja meghatározni a megfelelő variánst. Pl. a Caroline.pay_salary
a Caroline
exact típusának megfelelő pay_salary
-t fogja hívni.
Sokkal egyszerűbb, ha írunk egy új leszármazottat az EMPLOYEE
-nak pl. SECRETARY
-t, ha új variánsra van szükségünk.
Az explicit választéknak azért marad szerepe - pl. az előző egyetlen karakterből álló input feldolgozása és a megfelelő tevékenység végrehajtása. Itt az elágazás csak az első szintű szétválasztást végzi - betűk, számok, vezérlő karakterek. Ezen belül - már a dinamikus összekapcsolódás segítségével megy a dolog. Pl. a betűket használjuk, hogy egy parancs-táblát indexeljünk.
Ciklusok kódolására az Eiffel a legtöbb programozási nyelvvel ellentétben csak egy utasítást ad. Ennek szintaxisa a következő:
Ez egy fordítási opciótól függően hajt végre bizonyos utasításokat:
debug -- vagy debug("GRAPHICS_DEBUG") instr1; instr1; ... instrn; instrn; end end
debug
opció off
, akkor nem veszi figyelembe végrehajtáskor, ha on, akkor szépen sorban végrehajtja. A környezet lehetőséget kell adjon a ki- és bekapcsolásra, a default az off
. Debug_key
is használható, ekkor bizonyos debug_key
-kre kell bekapcsolható legyen.
Az iterátorokat tulajdonképpen általánosított vezérlési szerkezeteknek tekinthetjük, melyek megadására szintén lehetőség van Eiffel-ben, bár szigorúan nem részei a nyelv magjának, hanem a hozzá tartozó library-rendszerben találhatjuk meg őket. Az Eiffel library-hez tartozik az ITERATOR
osztály definiciója, mely egy speciális adatszerkezet (TRAVERSABLE
) elemein tud műveleteket végezni. Ebben az osztályban a különböző vezérlési szerkezetek általánosított változatai vannak megvalósítva: az if
, a while
, az until
, stb.