Az Euphoria Programozási nyelv (v2.3)

Alprogramok, modulok

Szintaxis

Eljárások

Az eljárás elvégez néhány számítást és lehet paraméter listája pl:

        procedure empty()

        end procedure



        procedure plot(integer x, integer y)

            position(x, y)

            puts(1, '*')

        end procedure

A paraméterek névvel adottak, és számokat meg kell határozni. De ez nem korlátozás, mivel bármely paraméter lehet bármi, akár változó hosszú sorozata tetszőleges objektumoknak. Más nyelvben a változó-hosszú paraméter listák nem lehetségesek, vagy nagyon bonyolultan oldhatók meg.
Az értéknek egy másolata adódik át. A formális paraméter változót lehet módosítani az eljárásban. de ez nem hat az a paraméter eljáráson kívüli értékére. (érték szerinti paraméter átadás)
 

Eljárás hívás

A procedure call elindítja az eljárás végrehajtását, a megadott aktuális paraméterekkel. Pl. plot(x, 23)

Függvények

Hasonlóak az eljárásokhoz, de van visszatérési értékük, és kifejezésben is használhatók. Pl.

        function max(atom a, atom b)

            if a >= b then

                return a

            else

                return b

            end if

        end function

Bármely Euphoria objektum vissza lehet adni. Ha több értéket szeretnél visszaadni, akkor ezt egy sorozat objektum segítségével teheted meg. Pl.

        return {x_pos, y_pos}

Az alprogram kifejezést használjuk, ha valami alkalmazható mind eljárásra, mind függvényre.


Típusok

Vannak speciális függvények, amelyek használhatók deklarációban. A típus pontosan egy paraméter van és egy atom a visszatérési értéke, ami vagy true (nem nulla) vagy false (nulla). Típusokat is meg kell hívni, hasonlóan más függvényekhez.


Változók

A változóhoz értéket lehet hozzárendelni. Pl.

        -- x may only be assigned integer values

        integer x

        x = 25



        -- a, b and c may be assigned *any* value

        object a, b, c

        a = {}

        b = a

        c = 0

A változó deklarálása során, a változónak adunk egy nevet és egy típust. A változó típusa megadja, hogy milyen értékeket lehet hozzárendelni a program futása során.


Konstansok

A konstans egy változó, ami kezdeti értékkel rendelkezik, és ez a kezdeti érték nem változhat meg a program futása során, azaz nem kaphat új értéket. Pl:

        constant MAX = 100

        constant Upper = MAX - 10, Lower = 5

        constant name_list = {"Fred", "George", "Larry"}

Konstansot nem lehet alprogramban definiálni.


Hatáskör

Egy szimbólum hatásköre a program azon része ahol a szimbólum deklarációja érvényes, azaz ahol a szimbólum látható, használható.

Euphoria-ban minden szimbólumot a használata előtt definiálni kell. Lehet hívni egy alprogramot, ami később következik a forráskódban, de ekkor speciális függvényt kell használni, routine_id(), call_func() vagy call_proc().

Az eljárások, függvények és típusok hívhatják magukat rekurzívan. Kölcsönös rekurzió az, ha A rutin hívja B rutint, ami közvetlenül vagy nem közvetlenül híja A rutint. Ez igényeli a routine_id() mechanizust.

A szimbólum attól a ponttól ahol a deklarálták a hatásköre végéig él. Ha a változót egy eljárásba vagy függvényben deklaráltuk (private változó), akkor hatásköre az eljárás vagy függvény vége. A hatásköre minden más változónak, konstansnak, eljárásnak, függvénynek és típusnak forrásfile vége, ahol deklarálták ha lokális. Ha a global kulcsszó megelőzi egy változó deklarációját, akkor a hatásköre határozatlanul megnő.

Amikor te includolsz egy Euphoria file-t a fő file-ban, akkor csak azok a változók és alprogramok használhatók a fő file-ban, amely deklarációja előtt global kulcsszó szerepel.

Csak a globális szimbólumok használhatók kívülről. Minden más szimbólum csak a saját file-ja belsejében használható. Változtatható egy belső alprogram vagy változó anélkül, hogy figyelni kellene az include file-ok alprogramjaira, változóira.

Néha ha mások által fejlesztett include file-okat használsz, találkozni fogsz a név konfliktussal. Az egyik include file szerzője azonos nevű globális szimbólumot használt, mint egy másik szerző. Ha megvan a forrás, akkor egyszerű szerkesztéssel az egyik include file-ban kijavíthatod a „hibát”, de ekkor ezt az eljárást mindig meg kell ismételni, ha új verziója "érkezik" az include file-nak. Euphoria-nak van egy egyszerű megoldása erre a problémára. Ehhez az include utasítás egy kiterjesztését használhatjuk, mint pl:

     include johns_file.e as john

     include bills_file.e as bill



     john:x += 1

     bill:x += 2

Ebben az esetben, az x változó deklarálva volt mindkét file-ban. Ha hivatkozni szeretnél mindkét változóra a file-odban, akkor használhatod a "névtér" azonosítót a john-t vagy bill-t, ezt az előtagot x elé írva ki tudod jelölni a megfelelő x változót. A névtér azonosítót hozzákapcsolható bármely felhasználó által definiált változóhoz, konstanshoz, eljáráshoz vagy függvényhez. Ezt használható a név konfliktus feloldására, vagy azért, hogy érthetőbbé, világosabbá tegye a programod kódját. A névtér azonosító helyi hatáskörű. Ez csak abban a file-ban látszik, ami az include utasítást tartalmazza. Különböző file-okban különböző névtér azonosítókat lehet definiálni azonos include file-ra való hivatkozáshoz.

Euphoria támogatja a szimbólumok hatáskörének korlátozását. Ha az összes szimbólum automatikusan globális lenne az egész programban, akkor sok név konfliktus keletkezne. A név ütközés okozhat fordítási hibát, vagy olyan apró hibához vezethet, ahol a program különböző részei véletlenül módosítanak azonos változót anélkül, hogy tudatában lennének ennek. Használd a legszigorúbb hatáskört, amit csak lehet. A változókat, ahol lehet private-nak definiáld, ha nem lehet lokálisnak és csak akkor ha ezt sem lehet golbálisnak.

Az Euphoria a szimbólum deklarációját először az aktuális eljárásban keresi, majd az aktuális file-ban, végül a globáis szimbólumokat más file-okban. Egy lokális szimbólum eltakarhat egy golbális szimbólumot, de a lokális szimbólum hatáskörének végén, a globális szimbólum újra látható.

Konstans deklarációnak bármely eljáráson kívül kell lennie. Konstans lehet globális vagy lokális, de nem lehet private.

A változók deklarálása egy alprogramban, az alprogram elején, a futtatható utasítások előtt kell lenne.

A legfelső szinten a deklarációknak, kívül kell lenniük bármely alprogramon, cikluson vagy if-utasításon.

A for-ciklusban a ciklus változó használata speciális. A ciklus változó automatikusan deklarálódik a ciklus elején, és hatásköre a ciklus végéig tart. Ha a ciklus függvényben vagy eljárásban van, a ciklus változó private változó, nem lehet ugyanolyan nevű más private változó. Ha a ciklus a legfelső szinten van, kívül bármely függvényen, eljáráson, a ciklus változó lokális változó, és nem lehet azonos nevű más lokális változó a file-ban. Használhatsz azonos nevű ciklus változót több különböző for ciklusban amíg nincs beágyazás. A ciklus változók nem deklarálható, mint más változó. Az érték határát for utasítás meghatározza.

A Változó Típusának Meghatározása

Változó deklaráció áll egy típus nevéből, amit a deklarálandó változók neve követ. Pl.

        object a



        global integer x, y, z



        procedure fred(sequence q, sequence r)

A típusok: object, sequence, atom és integer és predefined. Az objektum típusú változónak bármilyen értéke lehet. A sorozat típusúnak deklarált változónak mindig sorozatnak kell lennie. Az atom  típusúnak deklarált változónak mindig atomnak kell lennie. Az integer típusú változó értéke -1073741824-től +1073741823-ig egész szám lehet.

Megjegyzés:
egy eljárás vagy függvény paraméter listájában a típus nevét csak egyetlen paraméter név követheti.

Létrehozhatsz előre definiált, felhasználó által definiált típusokat. Ehhez definiálni egy egy-paraméteres függvényt, amit előbb deklarálni kell type ... end type segítségével, és nem function ... end function-nal. Pl.

        type hour(integer x)

            return x >= 0 and x <= 23

        end type



        hour h1, h2



        h1 = 10      -- ok

        h2 = 25      -- error! program aborts with a message

A h1 és h2 változónak értéke csak 0-tól 23-ig intervallumból lehet. Mikor h1 vagy h2 változóhoz értéket rendelünk az interpreter meghívja a hour()-t, és ez alapján fogadja el az új érték. Az új értéknél először ellenőrizi, hogy integer-e (mert "integer x"). Ha az, akkor return utasítás fog végrehajtódni, tesztelve x értékét (azaz az új értéket h1 vagy h2-nek.). Ha hour() igazat ad vissza, a végrehajtás normálisan folytatódik. Ha hour() hamisat ad vissza, akkor a program abortál megfelelő hibaüzenettel.

A "hour"-t deklarálhatjuk alprogram paramétereként pl.

        procedure set_time(hour h)

set_time() csak elfogadható értékű h paraméterrel lehet meghívni, ellenkező esetben a program abortál egy hibaüzenettel.

Egy változó típusa ellenőrizésre kerül mind hozzárendelés után (kivéve ahol a fordító előre meg tudja határozni, hogy az ellenőrzés nem szükséges) és a program rögtön befejeződni, ha a függvény visszatérési értéke hamis. Egy alprogram paraméterinek típus minden alkalommal ellenőrizve van, amikor az alprogramot meghívják. Ez ellenőrzés biztosítja, hogy a változónak sosem lehet olyan értéke, ami nem tartozik a változó típusához.

Más nyelvektől eltérően, a változó típusa nincs hatással a változóval történő számításokra. Csak a váltózó értéke számít egy kifejezésben. A típus csak hiba ellenőrzésre szolgál, megelőzve bármely „változó korrupciót”.

A típus ellenőrzés ki lehet kapcsolni a with type_check vagy without type_check speciális utasítások segítségével. A bekapcsolt állapot az alapértelmezés.

Euphoria típus meghatározó eljárásai egyszerűbbek, mint más nyelveké. Az Euphoria nagyobb rugalmasságot ad a programozónak a legális változók adattípusára nézve. Egy algoritmus használhat include vagy exclude értéket. Deklarálhatsz objektum típusú változót, aminek bármilyen értéke lehet. Egy eljárás tud nagyon különleges, egyedi típussal vagy nagyon általános típussal is dolgozni.

Egy nagy programnál, a szigorú típus definíció segítni tud a folyamat nyomon követésében. Logikai hibákat lehet kiszűrni segítségével, így az nem tud tovább terjedni.

Típusok is adnak értelmes, gép-ellenőrizhető dokumentáció körübelül programod, csinálva ezt könnyebb neked vagy másoknak hogy megértsék a te kódod egy későbbi időben. A típus ellenőrzést. Összekapcsolva az index ellenőrzéssel, nem inicializált változó ellenőrzéssel, és más ellenőrzéssel, ez mindig jelenlévő, szigorú futás-idejű típus ellenőrzés könnyebb nyomonkövethetőségét teszi lehetővé az Euphoria-ban, mint a legtöbb más nyelvben. Ezzel is növelve a megbízhatóságát a végső programnak. Így sok rejtett hiba, ami megmaradna a tesztelési fázisig, mint más nyelvben, az Euphoria-val kiszűrhető által.