= Osnovna struktura programa =
[[Includer(XLTOC)]]
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:
{{{
#!html
}}}
{{{
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 [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.
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 [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].
= 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 '' '', prvo se implicitno vrši evaluacija i konverzija u tip operanda i zatim se
izvršava operacija . 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:
{{{
}}}
gde je '''' ime tipa, a '''' izraz čiji se rezultat konvertuje
u '''' 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 [wiki:XLValidIdent 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:
{{{
#!html
}}}
{{{
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
}}}