Az ERLANG programozási nyelv

Bevezetés

Bevezets

Erlangban kt lehetosg is van grafikus alkalmazsok ksztsre, az egyik a GS, a msik a wx. A fejlesztok a wx hasznlatt javasoljk, mivel a GS-t tervezik kivenni a nyelvbol.

GS

A GS (Graphic System) egy ltalnos grafikus interfsz az Erlanghoz. Hasznlatt tervezik megszntetni az Erlang 15-s verzijtl. Fejlesztsekor kt alapelvet kvettek: - legyen egy grafikus rendszer, amelyet knnyen meg lehet tanulni - a rendszer legyen hordozhat klnbzo platformokra A GS egy ltalnos, minden platformon fut API-t hasznl. A grafikus rendszer alapja a grafikus objektum. Az objektumok hierarchikusan plnek fel, mindegyiknek van szloje. A leggyakrabban hasznlt objektumok: window, button, label, listbox, frame. Az objektumok ltrejttkkor kapnak egy egyedi azonostt, amellyel lehetosg van az objektum megjelensnek s mukdsnek konfigurlsra. A konfigurls az Options tulajdonsg segtsgvel trtnik. A legtbb option rendelkezhet tpussal s rtkkel. Amikor egy Erlang processz ltrehoz egy grafikus objektumot, akkor a processz fogja birtokolni az objektumot. A grafikus rendszer megjegyzi az objektumokat birtokl processzeket, mert az bejvo esemnyeket az objektumot birtokl processzhez tovbbtja, illetve a processz megszunse esetn megsemmisti a grafikus objektumot. Az esemnyek lnyegben zenetek, amelyeket a grafikus objektumok kldenek az oket birtokl processzeknek. A processzet informcit kap pldul arrl, hogy a felhasznl egy gombra klikkelt, mozgatott egy ablakot vagy egyb esemnyt vltott ki.

A GS hasznlathoz fontos fggvnyek

- gs:start(). Elindtja a grafikus szervert s visszaadja az objektum azonostjt. Ha mr el volt indtva, akkor csak visszaadja az azonostjt. - gs: stop(). Meglltja a grafikus szervert s bezr minden egyes ablakot, amelyet a grafikus szerver ltrehozott. A stop nem ellentettje a startnak, mert a stop hatsra minden egyes grafikus szerver megll s megszunnek az objektumaik. - gs:create(Objtype, Parent, Options). Ltrehoz egy j objektumot a megadott Objtype tpussal, megadott Parent szlovel s konfigurlja az objektumot a megadott Options jellemzokkel, majd visszaadja az objektum azonostjt, vagy hiba esetn egy {error, Reason} prt. - gs:create(Objtype, Name, Parent, Options). Mukdse hasonl a hrom paramteres create fgvnnyel, azzal a klnbsggel, hogy a Name paramterben megadott nvvel lehet majd az objektumra hivatkozni. A nvnek atomnak kell lennie. - gs:destroy(IdOrName). Megsemmisti az azonost vagy nv alapjn megadott objektumot s az sszes gyerekt. - gs:config(IdOrName, Options). A megadott jellemzokkel konfigurlja az azonostval vagy nvvel megadott objektumot. Ok-val tr vissza, ha sikeres volt a konfigurls, {erros, Reason} prral, ha nem volt sikeres. - gs:read(IdOrName, OptionKey). Megadja az azonostval vagy nvvel megadott objektumnak a megadott jellemzojt. Visszatr a jellemzo rtkvel, ha sikeres volt, illetve {error, Reason} prral, sikertelensg esetn. Az egyszerusg kedvrt hasznlhatak a fggvnyek paramterknt is, pl gs:window(gs:start(), {map, true}). Az objektumoknak nevet adhatunk ltrehozskor (create), a nv egy egyedi atom kell legyen, amely referenciaknt mukdik. Ezeket nevestett objektumoknak nevezzk. Ennek elonye a kdban a jobb tlthatsg s knnyebb hasznlat, mivel nem azonostkat kell megjegyezni. Az objektumok nevei loklisan a processzeken bell, amelyek ltrehozzk azokat. Azaz, a nv csak egy processzre rvnyes, gy klnbzo processzekben hasznalhatjuk ugyanazt a nevet klnbzo objektumokra. Abban az esetben, ha a processzek kztt hasznlunk referencikat, akkor a nevek helyett azonostkkal azonostja a GS az objektumokat. Szksg esetn az id optionnel le lehet krdezni az objektum azonostjt. Elosztott Erlangban vatosan kell bnni a nevekkel, ezeket {Name, Node} formban szokso megadni, a Node azt mondja meg, hogy milyen node-on keletkezett az objektum.

Option-ok

Minden egyes objektum tartalmaz egy halmazt, amelyben fel vannak sorolva a jellemzoi. Ezek kulcs-rtk prok, a kulcsok pedig atomok kell legyenek. Jellemzotol fggoen az rtk lehet Erlang term is. Gyakori jellemzok pldul: x, y koordintk, magassg, hossz, szveg, szn. A jellemzok megadhatk az objektumok ltrehozsakor is egy listban, pl.: Butt = gs:create(button,Win, [{x,10},{y,10}]) egy gomb, amely a (10,10)-es pozcin van. A megadott jellemzok kirtkelsi sorrendje nem definilt. Minden objektum lerhat termekkel a jellemzoibol. Ezeket besorolhatak egy tblzatba, amelyek a kvetkezo a fejlce: {Option, rtk}, Alaprtk, Lers. Az alaprtk lehet rtku, ami azt jelenti, hogy a gs vagy a back-end lltja be az rtket. Tbbfle optiont klnbztetnk meg: config-only, illetve read-only. A config-only jellezok rtke megvltoztathat, mg a read-only jellemzok csak lekrdezhetoek. Minden objektumok rendelkeznek tpussal.

Esemnyek

Az esemnyek valjban zenetek, amelyeket a birtokl processz kap meg valamilyen felhasznli interakci utn. Pldul, ha a felhasznl megklikkelt egy gombot, akkor a gombot gombot ltrehoz processz kap rla egy zenetet. Az objektumokra engedlyezni kell a klnbzo esemnyeket, pldul egy klikk esemny engedlyezse a {click, true} jellemzo belltsval trtnik. Az esemnyek engedlyezse utn a birtokl processz meg fogja kapni az esemnyeket. Az esemny egy ts, amely tartalmazza a {gs, IdOrName, EventType, Data, Args} informcikat. A gs megadja, hogy melyik grafikus szervertol jtt az esemny, az IdOrName megadja az objektumnak az azonostjt vagy nevt, amelyen esemny trtnt, EventType az esemny tpusa (pl. click), A Data rszbe tetszoleges Erlang term rhat, amely az zenet rsze lesz, az Args pedig specifikus informcikat tartalmaz (pl. egy motion esemny bekvetkezsekor tartalmazhatja az x s y koordintt). Kt klnbzo esemnytpust klnbztet meg a GS: a generikus esemnyt s az objektumspecifikus esemnyt. A generikus esemnyek minden tpus objektumra ugyangy mukdnek, a grafikus szerver mindig ugyanazt az informcit kldi a processznek. Ezek a kvetkezok: buttonpress, buttonrelease, enter, focus, keypress, leave, motion. A buttonpress s buttonrelease esemnyek akkor generldnak, amikor egy objektum belsejben egrgombnyoms trtnt. Az enter s leave esemnyek akkor generldnak, amikor egrrel egy objektum fel megy a felhasznl vagy elmegy egy objektumrl. A focus esemny esetben a billentyuzetrol megszunik a fkusz. Keypress esetben valamilyen szveget r a felhasznl az objektumba. Motion esetben pedig azt rzkeli, hogy az objektum egrrel trtno mozgatsa trtnt. Objektumspecifikus esemnyek esetben klnbzo objektumokra klnbzo vgrehajtsra van szksg. Ilyenek a click s doubleclick esemnyek. A programban az esemnyeket a le kell kezelni, ehhez az esemnyfogadnak meg kell adni a megfelelo azonostkat egy esemnykezelo ciklusban. Msik mdszer, hogy az objektumok ltrehozsakor nevet adunk az objektumoknak, majd ezzel a nvvel hivatkozunk az objektumokra az esemnykezeloben. Harmadik megolds az, hogy az esemnyek data rszben eltrolunk valamilyen informcit, ami segt az azonostsban.

Packer

Egyes esemnyek eredmnyt, mint pldul egy ablak mretnek a megvltoztatst a Packer, ms nven geometry manager vgzi. GS-ben a packer funkcionalitsa a frame tpus objektum tulajdonsga. A packer tulajdonsg a frame-mel egytt vgzi a gyerek objektumok mretnek s pozcijnak megvltoztatst. A packer frame rendezi el a gyerek objektumokat egy gridben megfelelo sorokban s oszlopokban. Minden sornak s oszlopnak van egy kiterjeds (streching) tulajdonsga, lehetsges a sorok nyjtsa, illetve a fix mretuv belltsa is. Ez a grid lthatatlan a felhasznl szmra.

A wx

Erlangban wx segtsgvel is ltrehozhatak a grafikus alkalmazsok. A wx jabb a GS-nl, s az Erlang inkbb a wx hasznlatt javasolja a felhasznlknak. A wx egy alkalmazs, amely egy Erlang kts a wxWidgetekre. A wxWidget egy objektumorientlt C++ api. Az Erlang egy-egy mappelst hasznal a wxWidgetekre. A wx egy interfsz, ami tbb modulba van osztva, minden modulnv wx-szel kezdodik. Ezek a modulok tartalmazzk a grafikus fellet megvalstshoz szksges fggvnyeket. Az objektumokat s objektum referencikat wx-ben processzeknek tekintjk, mintsem termeknek. Amikor az objektumokon operlunk, az objektumok llapotot vlthatnak, nem mukdnek funkcionlis objektumokknt, mint a termek. Minden objektumnak van tpusa, s az adott objektumot a megfelelo Erlang modul tud kezelni vagy az alosztlyai. Tpusellenozs trtnik elobb, gy garantlt, hogy csak a modul csak az objektumon vagy az rklt osztlyokbl szrmaz objektumokon kerl hasznlatba. Pldul a wxWindow C++ osztly a wxWindow Erlang modulban van implementlva, a tagjai pedig wxWindow:fggvny formban hvhat meg, pl. wxWindow::CenterOnParent. Alapvetoen az Erlang api megegyezik az eredetivel, de akad nhny kivtel, pl. a C++-ban hasznlt tmbk az Erlangban listkkal vannak reprezentlva, idonknt prral. A szneket a {Piros, Zld, Kk [,Alfa]} prral reprezentlja, az Alfa rtke opcionlis amikor argumentumot adunk a fggvnyeknek, viszont visszatrsi rtkben mindig szerepel. A define-ok, felsorolsok s globlis vltozk a wx.hrl fjlban szerepelnek. A define-ok nagy rsze konstans, de nem mindegyik. Nagyrszk platformfggetlen, a globlis vltozk pldnyostsa futsidoben trtnik meg, amirol a driver gondoskodik egy fggvnyhvssal. A loklis felsorolsok prefixe lesz az osztly neve. Ezen kvl nhny globlis fggvny, mint pldul a nem osztlybeli metdusok, a wx_misc modulban tallhatak. A wxErlang egy esetleges prhuzamostott drivertknt van megvalstva, azzal a htrnnyal, hogy egy programozi hiba esetn az emultor mukdse abbamarad. Prhuzamostott driver esetben szksg van egy olyan emulatorra, ami kpes szbiztosan kezelni a drivert interfszt. wx-ben a wx:new() fggvnnyel hozhatunk ltre j objektumokat s a wx:destroy() fggvnnyel lehet megsemmisteni. Minden wx:new() fggvnyhvs utn a gui ltrehoz egy krnyezetet s a hozz szksges memria mappelst. A ltrehozott krnyezetet meg kell osztani a processzek kztt, ha a wx-et tbb processzbol szeretnnk hasznlni. Az aktv krnyezetet le lehet krdezni a get_env() nevu fggvnnyel, illetve a set_env(Env) nevu fggvnnyel be lehet lltani az Env krnyezetet a processznek. Ha kt klnbzo processz is meghvja a wx:new() fggvnyt, akkor nem fognak hozzfrni egyms objektumaihoz, csak a sajtokhoz. A wx:destroy() megvsakor vagy, ha minden processz az alkalmazsban meghalt, a memribl trlodik a tartalom ls minden az alkalmazs ltal ltrehozott ablak bezrdik. A wx nem trl s nem hasznl garbage collectort sem, amg a program fut. Az objektumok nagy rsze trlodik, amikor a felhasznl bezrja az ablakot. Ekkor minden objektum megszunik, aminek nem null az ose. A wx:destroy() hasznlatval nvelhetjk a szabad memrit. Ez klnsen akkor fontos, ha a programoz a stacken ltrehoz objektumokat. Dialgusablakok esetben csak a dialgusablak aktv mindaddig, amg be nem zrjk.

Esemnyvezrls

Erlangban az esemnykezels eltr az eredeti apitl. A programoz meg kell hatrozza, hogy milyen esemnyeket akar lekezelni. Eldntheto, hogy a kapott esemnyeket zenetknt vagy callback fggvnyknt akarjuk lekezelni. Az esemnyekre val feliratkozs egy dinamikus esemnykezelo kapcsolat. Az esemnyekre fel kell iratkozni egy bizonyos objektummal egy id vagy egy lehetsges id-kat tartalmaz intervallummal. A callback fggvny hasznlata opcionlis, ha az esemny nem tartozka az objektumnak. gy az esemnykezelo is callback fggvny vagy egy processz lesz, ami fogadni fogja az esemny zeneteit. Az esemnyek vgrehajtsnak sorrendje lentrol felfel trtnik a widgetek hierachijban, az utoljra feliratkozott esemnykezelo rszrol eloszr. A wxEvent:skip() fgvnnyel tovbbdobhat az esemny, s az adott objektum nem fogja lekezelni, hanem tovbbaddik egy vagy tbb processznek. A legtbb esemnynek van alap esemnykezeloje. Az esemnyek szerkezete a kvetkezo: #wx{id = integer(), obj = wx:wxObject(), userData = term(), event = Rec}. Az id az esemnyt fogad objektum azonostjt jelenti. Az obj mezo tartalmazza az objektumot, amire kapcsoltuk az esemnyt. A useData mezo a felhasznl ltal meghatrozott termet, ez az esemnyre val feliratkozs tulajdonsga. Az event mezo tartalmazz egy rekordot az esemny tpusval. Az esemnyrekord elso eleme mindig az a tpus, amivel feliratkoztunk az esemnyre. Abban az esetben, ha az adott objektumon nem akarjuk lekezelni az esemnyt hasznlni kell a wx:skip() fggvnyt. Ugyanez megvalsthat callback fggvnnyel is. A skip tulajdonsg bellthat az esemnyre val feliratkozskor. Alaprtke hamis. Az igaz azt jelenti, hogy az objektum megkapja az zenetet, de nem akarja lekezelni, hanem tovbbadja. Dinamikus is meg lehet ezt adni a wxEvent:skip() meghvsval. A callback esemnyek le lehet kezelni egy 2 parammamteres fun callback fggvnnyel is, amit akkor kell megadni, amikor az objektumhoz kapcsoljuk az esemenykezelot. A fun kt paramtert vr,az elsot lerja az esemny szvege, a msodik pedig egy referencia az aktulis objektumra, amire meghvdott az esemny. Az esemnyobjektum elrheti az sszes adatot. Az esemnyobjektum trlodik miutn a fun fggvny visszatr. A callback fggvnyt mindig ms processz hvja meg s kizrlagosan hasznlja a gui-t. Egy callback fggvnyben levo msik processz hvsa holtpontot okozhat a rendszerben, ha a meghvott processz a gui-ra vr.

Fontosabb fggvnyek

- wx:new(). Elindtja a wx szervert, visszaad egy wx_object()-et. - wx:new(Option::[Option]). Ugyanaz, mint a 0 paramteres, csak az Option-ban megadhat a tulajdonsga: debug vagy level. - wx:destroy(). Lelltja a wx szervert. - wx:get_env(). Visszaadja a processznek belltott krnyezetet. A visszakapott krnyezet megadhat ms processznek, gy tudnak ugyanabban a krnyezetben futni. - wx:set_end(Wx_env::wx_env()). Belltja a paramterben megkapott krnyezetet a processznek. - wx:null(). Null objektumot ad vissza. - wx:is_null(Wx_ref::wx_object()). Visszaadja, hogy az adott objektum null-e. - wx:getObjectType(Wx_ref::wx_object()). Visszaadja az objektum tpust. - wx:demo(). Elindtja az Erlang demo programjt, ha a mappa ltezik s le van fordtva.

Feladat

A program indtst kvetoen megjelenik 2 lista s kt gomb. A menbol trtno kivlaszts utn az adatok megjelennek a bal oldali listban. A listban tetszoleges egy elem kivlaszthat, majd a gombok segtsgvel tteheto a msik listba. A program indtskor ltrehoz adatbzisokat, amiket feltlt elemekkel, majd adatbzisbl olvassa ki a listban megjelentendo elemeket.

Szerzo

Ginl Eszter

Kszts ve

2012

Fejlesztokrnyezet

A program futtatshoz az Erlang shellre van szksg, ennek segtsgvel trtnik a fordts. A program egyszeru szvegszerkesztoben kszlt. A program futtatshoz szksges lpsek: - az Erlang shell elindtsa - a program path bellts, ez esetben a forrsfjl a D:/Programok mappban tallhat: cd("D:/Programok"). paranccsal - fordts, ha pelda.erl a forrskdot tartalmaz fjl: c(pelda). paranccsal - indts: pelda:init(). ha az init a kezdofggvny