Osnovna struktura programa

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 + a2unija a1 i a2
a1 - a2skup elemenata iz a1 koji se ne pojavljuju u a2
a1 / a2skup elemenata iz a1 koji se ne pojavljuju u a2 i elemenata iz a2 koji se ne pojavljuju u a1
a1 * a2presek a1 i a2
e in avrać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 + list2rezultat je lista čiji prefiks je lista list1, a sufiks lista list2
list1 + erezultat je lista čiji prefiks je lista list1, a sufiks lista čiji jedini element je e
e in avrać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