| | 1 | = Osnovna struktura programa = |
|---|
| | 2 | [[Includer(XLTOC)]] |
|---|
| | 3 | |
|---|
| | 4 | XL program se sastoji od jednog ili više modula, od kojih se svaki standardno nalazi u fajlu istog imena kao i modul, sa dodatom ekstenzijom "xl". Sadržaj modula Demo se nalazi u fajlu Demo.xl i izgleda ovako: |
|---|
| | 5 | |
|---|
| | 6 | {{{ |
|---|
| | 7 | #!html |
|---|
| | 8 | <a name="Demo.xl" /> |
|---|
| | 9 | }}} |
|---|
| | 10 | {{{ |
|---|
| | 11 | module Demo; |
|---|
| | 12 | |
|---|
| | 13 | proc Main(start, kraj, inc := 1) = |
|---|
| | 14 | var |
|---|
| | 15 | i: number; |
|---|
| | 16 | begin |
|---|
| | 17 | i:=start; |
|---|
| | 18 | repeat |
|---|
| | 19 | :$i$ |
|---|
| | 20 | i:=i+inc; |
|---|
| | 21 | until i>kraj; |
|---|
| | 22 | end Main; |
|---|
| | 23 | |
|---|
| | 24 | begin |
|---|
| | 25 | end Demo. |
|---|
| | 26 | }}} |
|---|
| | 27 | |
|---|
| | 28 | Startuje se sa 2 ili tri argumenta, na primjer (% je prompt): |
|---|
| | 29 | {{{ |
|---|
| | 30 | % xli Demo.xl 1 5 2 |
|---|
| | 31 | 1 |
|---|
| | 32 | 3 |
|---|
| | 33 | 5 |
|---|
| | 34 | |
|---|
| | 35 | % xli Demo.xl 1 5 |
|---|
| | 36 | 1 |
|---|
| | 37 | 2 |
|---|
| | 38 | 3 |
|---|
| | 39 | 4 |
|---|
| | 40 | 5 |
|---|
| | 41 | }}} |
|---|
| | 42 | |
|---|
| | 43 | U ovom primjeru smo pri deklarisanju varijable naveli i njen tip - number. Više o tome u narednoj sekciji. |
|---|
| | 44 | |
|---|
| | 45 | == Varijable i tipovi == |
|---|
| | 46 | |
|---|
| | 47 | U toku izvršavanja programa tip varijable se može menjati, osim ukoliko prilikom deklarisanja varijable nije specificiran tip. Specificiranjem tipa kao u [wiki:XLRef#Demo.xl Demo.xl] postižemo da se vrijednost svakog izraza, prije pridruživanja vrijednosti našoj varijabli, implicitno konvertuje u navedeni tip. Kao i kod eksplicitne konverzije, ukoliko konvertovanje nije moguće, to je runtime greška. |
|---|
| | 48 | |
|---|
| | 49 | Sama varijabla može biti zaštićena (readonly) ako se deklariše na sljedeći način: |
|---|
| | 50 | |
|---|
| | 51 | {{{ |
|---|
| | 52 | var |
|---|
| | 53 | path: const text := "/usr/lib/honet"; |
|---|
| | 54 | }}} |
|---|
| | 55 | |
|---|
| | 56 | Pokušaj pisanja u ovako deklarisanu varijablu je runtime greška. |
|---|
| | 57 | |
|---|
| | 58 | Osnovni tipovi u XL-u su [wiki:XLRef#Tipnumber number], [wiki:XLRef#Tiptext text], [wiki:XLRef#Tipboolean boolean], [wiki:XLRef#Tipdate date], [wiki:XLRef#Tiptime time], [wiki:XLRef#Tiparray array] (asocijativni niz), [wiki:XLRef#Tiplist list] (uređena lista), [wiki:XLRef#Tipbyte byte], [wiki:XLRef#Tipbytes bytes], [wiki:XLRef#Tipqueue queue] i [wiki:XLRef#Tipforeign foreign]. |
|---|
| | 59 | |
|---|
| | 60 | = Izrazi (expressions) = |
|---|
| | 61 | |
|---|
| | 62 | U XL izrazima su podržane sve standardne aritmetičke i logičke operacije. Njihova primena je ograničena tipom operanda na koji se primenjuje. |
|---|
| | 63 | |
|---|
| | 64 | Tip rezultata unarne operacija nad podizrazom je tip samog podizraza. Kod binarne operacije ''<expr1> <op> <expr2>'', prvo se implicitno vrši evaluacija i konverzija <expr2> u tip operanda <expr1> i zatim se |
|---|
| | 65 | izvršava operacija <op>. U slučaju da konverzija nije dozvoljena rezultat operacije je runtime greška. |
|---|
| | 66 | |
|---|
| | 67 | == Eksplicitna konverzija tipova == |
|---|
| | 68 | |
|---|
| | 69 | Takođe je moguće je izvršiti eksplicitnu konverziju tipova sa: |
|---|
| | 70 | |
|---|
| | 71 | {{{ |
|---|
| | 72 | <tip> <expr> |
|---|
| | 73 | }}} |
|---|
| | 74 | |
|---|
| | 75 | gde je ''<tip>'' ime tipa, a ''<expr>'' izraz čiji se rezultat konvertuje |
|---|
| | 76 | u ''<tip>'' tip. |
|---|
| | 77 | |
|---|
| | 78 | U slučaju da konverzija nije dozvoljena rezultat operacije je runtime greška. |
|---|
| | 79 | |
|---|
| | 80 | = Osnovni tipovi (basic types) = |
|---|
| | 81 | |
|---|
| | 82 | == Tip number == |
|---|
| | 83 | |
|---|
| | 84 | Varijabla ovog tipa pretstavlja realan broj. Dozvoljene su |
|---|
| | 85 | sve aritmeticke i logicke operacije. Moguce je konvertovati |
|---|
| | 86 | sve tipove u number tip osim foreign tipa. |
|---|
| | 87 | |
|---|
| | 88 | == Tip text == |
|---|
| | 89 | |
|---|
| | 90 | Varijable ovog tipa pretstavlja tekst, neogranicene duzine. |
|---|
| | 91 | Dozvoljeno je sabiranje (spajanje) dva teksta preko operatora |
|---|
| | 92 | plus, kao i logicke operacije poredjenja. Moguce je konvertovati |
|---|
| | 93 | sve tipove u text tip osim foreign tipa. |
|---|
| | 94 | |
|---|
| | 95 | == Tip boolean == |
|---|
| | 96 | |
|---|
| | 97 | Varijabla ovog tipa može imati jednu od dvije vrednosti (true ili false). Dozvoljene su sve logičke operacije. Moguće je konvertovati number i text tipove u boolean tip. |
|---|
| | 98 | |
|---|
| | 99 | == Tip date == |
|---|
| | 100 | |
|---|
| | 101 | Varijabla ovog tipa predstavlja momenat u realnom vremenu i sastoji se od datuma i vremena u danu. Dozvoljene su aritmetičke operacije sabiranja i oduzima, kao i logičke operacije poređenja. |
|---|
| | 102 | |
|---|
| | 103 | Moguce je konvertovati number i text tipove u date tip. |
|---|
| | 104 | |
|---|
| | 105 | == Tip time == |
|---|
| | 106 | |
|---|
| | 107 | Varijabla ovog tipa reprezentuje vreme koje moze biti pozitivno |
|---|
| | 108 | i negativno. Dozvoljene su aritmeticke operacije sabiranja i |
|---|
| | 109 | oduzima, kao i logicke operacije poredjenja. Moguce je |
|---|
| | 110 | konvertovati number i text tipove u time tip. |
|---|
| | 111 | |
|---|
| | 112 | == Tip array == |
|---|
| | 113 | |
|---|
| | 114 | {{{ |
|---|
| | 115 | a := { k1 := a1, k2 := a2, ..., kn := an } |
|---|
| | 116 | }}} |
|---|
| | 117 | |
|---|
| | 118 | gde je ''ai'' asocirana vrednost uz ''ki'' ključ. Pristup elementima niza se vrši preko ključeva i može se izvesti na jedan od naredna dva (ekvivalentna) načina: |
|---|
| | 119 | |
|---|
| | 120 | * ''a.ki'' |
|---|
| | 121 | Ukoliko je vrijednost ključa poznata u momentu pisanja programa i ukoliko ''ki'' zadovoljava [wiki:XLValidIdent pravila kreiranja identifikatora u XL], može se koristiti ovaj metod. |
|---|
| | 122 | * ''a[ki]'' |
|---|
| | 123 | ''ki'' je izraz čija vrijednost se konvertuje u ''text'' koji onda služi kao ključ. |
|---|
| | 124 | |
|---|
| | 125 | Pokušaj pristupa elementu koji ne postoji u nizu je runtime greška, kao i indeksiranje (drugi metod) izrazom koji ne može da se konvertuje u ''text''. |
|---|
| | 126 | |
|---|
| | 127 | Dozvoljene su sledeće operacije: |
|---|
| | 128 | |
|---|
| | 129 | ||a1 + a2||unija a1 i a2|| |
|---|
| | 130 | ||a1 - a2||skup elemenata iz a1 koji se ne pojavljuju u a2|| |
|---|
| | 131 | ||a1 / a2||skup elemenata iz a1 koji se ne pojavljuju u a2 i elemenata iz a2 koji se ne pojavljuju u a1|| |
|---|
| | 132 | ||a1 * a2||presek a1 i a2|| |
|---|
| | 133 | ||e in a||vraća odgovor na pitanje "da li element sa ključem e postoji u nizu a"|| |
|---|
| | 134 | |
|---|
| | 135 | U prve četiri operacije a1 i a2 moraju biti nizovi. |
|---|
| | 136 | |
|---|
| | 137 | Nije dozvoljena konverzija bilo kojeg drugog tipa u niz. |
|---|
| | 138 | |
|---|
| | 139 | == Tip list == |
|---|
| | 140 | |
|---|
| | 141 | {{{ |
|---|
| | 142 | list:=[elem1, elem2, ..., elemn] |
|---|
| | 143 | }}} |
|---|
| | 144 | |
|---|
| | 145 | ||list1 + list2||rezultat je lista čiji prefiks je lista ''list1'', a sufiks lista ''list2''|| |
|---|
| | 146 | ||list1 + e||rezultat je lista čiji prefiks je lista ''list1'', a sufiks lista čiji jedini element je ''e''|| |
|---|
| | 147 | ||e in a||vraća true ako se element sa ključem e postoji u nizu a, dok u suprotnom vraća false|| |
|---|
| | 148 | |
|---|
| | 149 | gdje su ''elemi'' elementi liste kojima se pristupa preko njihovog rednog broja u listi. Prvi element liste ima redni broj jedan. Npr. ''list![5]'' nam vraća peti element liste ''list''. |
|---|
| | 150 | |
|---|
| | 151 | Pokušaj pristupa elementu koji ne postoji u listi je runtime greška. |
|---|
| | 152 | |
|---|
| | 153 | == Tip foreign == |
|---|
| | 154 | |
|---|
| | 155 | Foreign je bilo koji od Modula-3 objektnih tipova koji nema specifičnu podršku u XL, kao ostali do sada nabrojani standardni tipovi. Sa stanovišta XL to je ADT. Modula-3 ekstenzije XL-a mogu da mapiraju metode koje se onda mogu pozivati iz XL koda. Sa ''foreigntypename'' može se dobiti tekstualno ime konkretnog tipa, a moguće je, korištenjem ''new'' kreirati novu foreign varijablu na osnovu imena Modula-3 objektnog tipa. |
|---|
| | 156 | |
|---|
| | 157 | Mapirane metode se pozivaju na standardan način. Na primjer: |
|---|
| | 158 | |
|---|
| | 159 | {{{ |
|---|
| | 160 | var |
|---|
| | 161 | f; |
|---|
| | 162 | |
|---|
| | 163 | ... |
|---|
| | 164 | f:=new("HTTP.Field").init("X-Engine", "m3w"); |
|---|
| | 165 | ... |
|---|
| | 166 | }}} |
|---|
| | 167 | |
|---|
| | 168 | == Tip queue == |
|---|
| | 169 | |
|---|
| | 170 | Queue tip je objektni tip dizajniran za potrebe slanja poruka među threadovima, i to je standardni mehanizam za sinhronizaciju threadova. |
|---|
| | 171 | |
|---|
| | 172 | Trivijalan, koliko je moguće a da je i dalje smislen, primjer: |
|---|
| | 173 | |
|---|
| | 174 | {{{ |
|---|
| | 175 | #!html |
|---|
| | 176 | <a name="pinger.xl"> |
|---|
| | 177 | }}} |
|---|
| | 178 | {{{ |
|---|
| | 179 | module pingie; |
|---|
| | 180 | |
|---|
| | 181 | thread adder(q: queue) = |
|---|
| | 182 | var |
|---|
| | 183 | i; |
|---|
| | 184 | begin |
|---|
| | 185 | loop |
|---|
| | 186 | i:=q.receive(); |
|---|
| | 187 | if i="Done" then |
|---|
| | 188 | exit; |
|---|
| | 189 | end; |
|---|
| | 190 | :Received: $i$ |
|---|
| | 191 | end; |
|---|
| | 192 | :Ending adder |
|---|
| | 193 | end adder; |
|---|
| | 194 | |
|---|
| | 195 | proc Main() = |
|---|
| | 196 | var |
|---|
| | 197 | q := queue; |
|---|
| | 198 | t, i; |
|---|
| | 199 | begin |
|---|
| | 200 | for i:=1 to 3 do |
|---|
| | 201 | :Sending: $i$ |
|---|
| | 202 | q.send(i); |
|---|
| | 203 | if i=1 then |
|---|
| | 204 | t:=adder(q); |
|---|
| | 205 | end; |
|---|
| | 206 | delay(1); |
|---|
| | 207 | end; |
|---|
| | 208 | q.send("Done"); |
|---|
| | 209 | finish t; |
|---|
| | 210 | end Main; |
|---|
| | 211 | |
|---|
| | 212 | begin |
|---|
| | 213 | end pingie. |
|---|
| | 214 | |
|---|
| | 215 | }}} |
|---|
| | 216 | |
|---|
| | 217 | daje sljedeći rezultat: |
|---|
| | 218 | |
|---|
| | 219 | {{{ |
|---|
| | 220 | % xli pingie.xl |
|---|
| | 221 | Sending: 1 |
|---|
| | 222 | Received: 1 |
|---|
| | 223 | Sending: 2 |
|---|
| | 224 | Received: 2 |
|---|
| | 225 | Sending: 3 |
|---|
| | 226 | Received: 3 |
|---|
| | 227 | Ending adder |
|---|
| | 228 | }}} |