Az Afnix programozási nyelv

Vezérlési szerkezetek

Elágazások

If elágazás

Az if lefoglalt kulcsszónak kettõ vagy három paramétert adhatunk meg. Az elsõ paraméter a kiértékelendõ logikai kifejezést adja meg, ha az elsõ paraméter kiértékelése igaz eredményt ad vissza a második paraméter értékelõdik ki, ha hamis értéket, akkor a harmadik, vagy ha ez nem létezik, akkor nil értékkel tér vissza. Egy érdekes példa az if elágazás és a rekurzió kombinált alkalmazására a Fibonacci sor kiszámítása.

const fibo (gamma (n) (if (< n 2) n (+ (fibo (- n 1)) (fibo (- n 2))))

Switch elágazás

A switch lefoglalt kulcsszó egy feltételválasztásnak felel meg. Az elsõ paraméter adja meg az azonosítót, aminek az értékei szerint szeretnénk választani, a második paraméter a lehetséges értékek és a hozzájuk tartozó utasítások halmaza.

# return the primary color in a rgb const get-primary-color (color value) ( switch color ( ("red" (return (value:substr 0 2)) ("green" (return (value:substr 2 4)) ("blue" (return (value:substr 4 6)) ) )

Ciklusok

While ciklus

A while lefoglalt kulcsszónak is kettõ vagy három paramétere lehet. Két paraméter esetén az elsõ a ciklusfeltétel a második pedig a ciklus magja. Három paraméter esetén az elsõ a ciklus „elõfeltétele”, egy utasítás ami csak egyszer hajtódik végre, ekkor a második paraméter lesz a ciklusfeltétel, a harmadik pedig a ciklusmag. Egy érdekes példa az alkalmazására a legnagyobb közös osztó kiszámítása.

const gcd (u v) { while (!= v 0) { trans r (u:mod v) u:= v v:= r } eval u }

Do ciklus

A do ciklus hasonló a while ciklushoz, azzal a különbséggel, hogy a ciklusfeltétel a ciklusmag lefutás után értékelõdik ki, nem pedig elõtte. Itt is két vagy három paramétert adhatunk meg. Két paraméter esetén az elsõ a ciklusmag, a második a ciklusfeltétel. Három paraméter esetén az elsõ paraméter az inicializálás, második a ciklusmag, harmadik a ciklusfeltétel.

# számjegyek megszámolása egy sztringben const number-of-digits (s) { const len (s:length) trans index 0 trans count 0 do { trans c (s:get index) if (c:digit-p) (count:++) } (< (index:++) len) eval count }

Loop ciklus

A loop lefoglalt kulcsszónak négy paramétert kell megadnunk. Az elsõ paraméter az inicializálás, a második a kilépési feltétel, a harmadik adja meg a lépést, a negyedik pedig a ciklusmagot.

# számok kiírása egytõl tízig loop (trans i 0) (< i 10) (i:++) (println i)

Iterációk

Az iterálható objektumokhoz léteznek iterációk, tipikus iterálható típusok pl. a lista, vektor, tömb. Kétféle iterációra van lehetõség, az elsõ módszer a for lefoglalt kulcsszót használja, a második egy explicit iterátor, amit maga az objektum hoz létre.

For iterációnál három paramétert kell megadni, az elsõ az iterátor változója, a második az iterált összetett objektum, a harmadik pedig a végrehajtandó utasítás. Egy for iterációban lehetõségünk van több objektum párhuzamos iterálására, erre jó példa a két vektor skaláris szorzatát kiszámító iteráció.

# compute the scalar product of two vectors const scalar-product (u v) { trans result 0 for (x y) (u v) (result:+= (* x y)) eval result }

Az iteráció elvégezhetõ explicit módon létrehozva az iterátort minden egyes vektorhoz és lépésrõl-lépésre haladva is (get-iterator ill. next felhasználásával).

# scalar product with explicit iterators const scalar-product (u v) { trans result 0 trans u-it (u:get-iterator) trans v-it (v:get-iterator) while (u:valid-p) { trans x (u:get-object) trans y (v:get-object) result:+= (* x y) u:next v:next } eval result }

Egyéb vezérlési szerkezetek

Return kulcsszó

Más nyelvekhez hasonlóan, a return végrehajtásakor a megadott érték visszaadódik és a végrehajtás menete megszakad.

# initialize a vector with a value const vector-init (length value) { if (<= length 0) return (Vector) trans result (Vector) do (result:add value) (> (length:--) 0) }

Eval és protect kulcsszavak

Az eval kulcsszót akkor használjuk, ha mindenképp ki akarunk értékelni egy kifejezést, tipikusan függvények törzsében használt kulcsszó, ha vissza szeretnénk adni egy részkifejezés érékét. Ezzel szemben a protect kulcsszó létrehoz egy kifejezést a kiértékelése nélkül. Az eval használható a protecttel védett kifejezések mindenképpeni kiértékelésére is.

const add (protect (+ 1 2)) eval add)

Block kulcsszó

Új blokk létrehozására alkalmas kulcsszó, mindig az utoljára kiértékelt kifejezés értékét adja vissza. A blokkban létrehozott változók/objektumok lokálisak, ezért a blokk végrehajtása után ezek megsemmisülnek.