Icon

Vezérlési szerkezetek

Szekvencia

Kifejezések szekvenciáját a { e1, e2, ..., en } paranccsal adhatjuk meg. Itt minden kifejezés -kivéve az utolsót- csak egy értéket generálhat. Akár sikeres volt az egyik kiértékelés, akár sikertelen, a vezérlés a következõ kifejezésre adódik. Az utolsó kifejezés (en) annyi értéket generálhat, amennyit a környezet megenged neki. Például:

every { writes ( " ", 1 to 5 ) ; writes ( " ", 6 to 10 ) }

a következõ sorozatot fogja kiírni:

1 6 7 8 9 10

every e1 do e2

Ez gyakorlatilag azt mondja, hogy az e1 minden értékével értékelje ki e2-t. A következõképp működik:

Az every-kifejezés is beilleszthetõ egy másik kifejezésbe, de nem ad vissza értéket (jobban szólva &fail lesz az értéke, kivéve ha break-kel lépünk ki belõle).

while e1 do e2

Ez a más nyelvekbõl megismert while-ciklus. Abban különbözik az every-tõl, hogy minden iterációban csak egy értéket generál e1-bõl. Részletesen:

until e1 do e2

Ez a szerkezet teljesen megfelel a következõ while-os kifejezésnek:

while not (e1) do e2

repeat e2

Folyamatosan elkezdi kiértékelni az e kifejezést, de nem fog terminálni (végtelen ciklus), kivéve a break, return, suspend vagy fail utasítás használatával.

if e1 then e2 else e3

Az if-kifejezés nagyon hasonlít a más nyelvekben megismert elágazásra, az alábbi különbségeket kivéve:

Ha nem adunk meg else ágat, akkor azt úgy veszi, mintha sikertelen lenne az e3 kifejezés. Például:

if x > y then x :=: y

(Ha x nagyobb, mint y, akkor felcseréli a két változó értékét.)

Cél-orientált kiértékelés

Az Icon nyelvben az utasítások végrehajtása úgynevezett cél orientált kiértékelés alapján hajtódnak végre. Szemléltetésül vegyük a következõ példát: Keressük az olyan derékszögű háromszögeket, melyeknek az oldalainak összege legalább 1000 és legfeljebb 2000.

procedure main() local i,j,m,n if i:=1 to 2000 & j:=i to 2000 & n:=i*i+j*j & m:=integer(sqrt(n)) & m*m = n & 1000 <= i+j+m <=2000 then write(i," ",j," ",m) end

Megfigyelhetõ hogy a kiértékelés folyamatosan hajtódik végre és ahol a kiértékelés nem sikerül ott visszalép az elõzõ kifejezésre, azt újra kiértékeli és ha az sikeres akkor megint tovább lép.

case { }

Többirányú elágazás. Az általános formája:

case e1 of { e2 : e3 e4 : e5 ... default : en }

Az alábbiak szerint működik:

not e

Nagyon egyszerűen a not operátor akkor ad vissza fail-t ha sikeres volt az e kiértékelése, különben pedig sikerest ad.

break e

Ez a kifejezés használható arra, hogy kilépjünk egy befoglaló ciklusból (every, while, until, repeat). Ha megadjuk az e kifejezést is, akkor kilép a ciklusból és generálja a kifejezés értékét. Például:

procedure main() local i,j i := 1 j := 1 repeat { write(i) i += j i :=: j if i > 100000 then break } end

Ez a program kilistázza a Fibonacci-számokat 100000-ig.

next

Ha egy ciklus törzsében megadunk egy next-t, akkor egybõl megkezdi a ciklusfeltételben szereplõ kifejezés következõ kiértékelését.