Osnovna struktura programa
XL Reference
- Osnovna struktura programa
- Izrazi (expressions)
- Osnovni tipovi (basic types)
- Iskazi (statements)
- Iskaz dodeljivanje
- Iskaz if
- Iskaz for
- Iskaz while
- Iskaz loop
- Iskaz repeat
- Iskaz case
- Iskaz match
- Iskaz exit
- Iskaz return
- Iskaz every
- Iskaz try
- Iskaz raise
- Iskaz lock
- Iskaz wait
- Iskaz signal
- Iskaz finish
- Iskaz text
- ''Builtin'' moduli
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:
module Demo;
proc Main(start, kraj, inc := 1) =
var
i: number;
begin
i:=start;
repeat
:$i$
i:=i+inc;
until i>kraj;
end Main;
begin
end Demo.
Startuje se sa 2 ili tri argumenta, na primjer (% je prompt):
% xli Demo.xl 1 5 2 1 3 5 % xli Demo.xl 1 5 1 2 3 4 5
U ovom primjeru smo pri deklarisanju varijable naveli i njen tip - number. Više o tome u narednoj sekciji.
Varijable i tipovi
U toku izvršavanja programa tip varijable se može menjati, osim ukoliko prilikom deklarisanja varijable nije specificiran tip. Specificiranjem tipa kao u 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.
Sama varijabla može biti zaštićena (readonly) ako se deklariše na sljedeći način:
var
path: const text := "/usr/lib/honet";
Pokušaj pisanja u ovako deklarisanu varijablu je runtime greška.
Osnovni tipovi u XL-u su number, text, boolean, date, time, array (asocijativni niz), list (uređena lista), byte, bytes, queue i foreign.
Izrazi (expressions)
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.
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 izvršava operacija <op>. U slučaju da konverzija nije dozvoljena rezultat operacije je runtime greška.
Eksplicitna konverzija tipova
Takođe je moguće je izvršiti eksplicitnu konverziju tipova sa:
<tip> <expr>
gde je <tip> ime tipa, a <expr> izraz čiji se rezultat konvertuje u <tip> tip. U slučaju da konverzija nije dozvoljena rezultat operacije je runtime greška.
Osnovni tipovi (basic types)
Tip number
Varijabla ovog tipa pretstavlja realan broj. Dozvoljene su sve aritmeticke i logicke operacije. Moguce je konvertovati sve tipove u number tip osim foreign tipa.
Tip text
Varijable ovog tipa pretstavlja tekst, neogranicene duzine. Dozvoljeno je sabiranje (spajanje) dva teksta preko operatora plus, kao i logicke operacije poredjenja. Moguce je konvertovati sve tipove u text tip osim foreign tipa.
Tip boolean
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.
Tip date
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.
Moguce je konvertovati number i text tipove u date tip.
Tip time
Varijabla ovog tipa reprezentuje vreme koje moze biti pozitivno i negativno. Dozvoljene su aritmeticke operacije sabiranja i oduzima, kao i logicke operacije poredjenja. Moguce je konvertovati number i text tipove u time tip.
Tip array
a := { k1 := a1, k2 := a2, ..., kn := an }
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:
- a.ki Ukoliko je vrijednost ključa poznata u momentu pisanja programa i ukoliko ki zadovoljava pravila kreiranja identifikatora u XL, može se koristiti ovaj metod.
- a[ki] ki je izraz čija vrijednost se konvertuje u text koji onda služi kao ključ.
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.
Dozvoljene su sledeće operacije:
| a1 + a2 | unija a1 i a2 |
| a1 - a2 | skup elemenata iz a1 koji se ne pojavljuju u a2 |
| a1 / a2 | skup elemenata iz a1 koji se ne pojavljuju u a2 i elemenata iz a2 koji se ne pojavljuju u a1 |
| a1 * a2 | presek a1 i a2 |
| e in a | vraća odgovor na pitanje "da li element sa ključem e postoji u nizu a" |
U prve četiri operacije a1 i a2 moraju biti nizovi.
Nije dozvoljena konverzija bilo kojeg drugog tipa u niz.
Tip list
list:=[elem1, elem2, ..., elemn]
| list1 + list2 | rezultat je lista čiji prefiks je lista list1, a sufiks lista list2 |
| list1 + e | rezultat je lista čiji prefiks je lista list1, a sufiks lista čiji jedini element je e |
| e in a | vraća true ako se element sa ključem e postoji u nizu a, dok u suprotnom vraća false |
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.
Pokušaj pristupa elementu koji ne postoji u listi je runtime greška.
Tip foreign
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.
Mapirane metode se pozivaju na standardan način. Na primjer:
var
f;
...
f:=new("HTTP.Field").init("X-Engine", "m3w");
...
Tip queue
Queue tip je objektni tip dizajniran za potrebe slanja poruka među threadovima, i to je standardni mehanizam za sinhronizaciju threadova.
Trivijalan, koliko je moguće a da je i dalje smislen, primjer:
module pingie;
thread adder(q: queue) =
var
i;
begin
loop
i:=q.receive();
if i="Done" then
exit;
end;
:Received: $i$
end;
:Ending adder
end adder;
proc Main() =
var
q := queue;
t, i;
begin
for i:=1 to 3 do
:Sending: $i$
q.send(i);
if i=1 then
t:=adder(q);
end;
delay(1);
end;
q.send("Done");
finish t;
end Main;
begin
end pingie.
daje sljedeći rezultat:
% xli pingie.xl Sending: 1 Received: 1 Sending: 2 Received: 2 Sending: 3 Received: 3 Ending adder
