Changes from Version 1 of XLRef

Show
Ignore:
Author:
trac (IP: 127.0.0.1)
Timestamp:
08/29/2006 10:15:32 PM (4 years ago)
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • XLRef

    v0 v1  
     1= Osnovna struktura programa = 
     2[[Includer(XLTOC)]] 
     3 
     4XL 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{{{ 
     11module Demo; 
     12 
     13proc 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 
     24begin 
     25end Demo. 
     26}}} 
     27 
     28Startuje se sa 2 ili tri argumenta, na primjer (% je prompt): 
     29{{{ 
     30% xli Demo.xl 1 5 2 
     311 
     323 
     335 
     34 
     35% xli Demo.xl 1 5 
     361 
     372 
     383 
     394 
     405 
     41}}} 
     42 
     43U ovom primjeru smo pri deklarisanju varijable naveli i njen tip - number. Više o tome u narednoj sekciji. 
     44 
     45== Varijable i tipovi == 
     46 
     47U 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 
     49Sama 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 
     56Pokušaj pisanja u ovako deklarisanu varijablu je runtime greška. 
     57 
     58Osnovni 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 
     62U 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 
     64Tip 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 
     65izvršava operacija <op>. U slučaju da konverzija nije dozvoljena rezultat operacije je runtime greška. 
     66 
     67== Eksplicitna konverzija tipova == 
     68    
     69Takođe je moguće je izvršiti eksplicitnu konverziju tipova sa: 
     70 
     71{{{ 
     72<tip> <expr> 
     73}}} 
     74 
     75gde je ''<tip>'' ime tipa, a ''<expr>'' izraz čiji se rezultat konvertuje 
     76u ''<tip>'' tip. 
     77    
     78U slučaju da konverzija nije dozvoljena rezultat operacije je runtime greška. 
     79 
     80= Osnovni tipovi (basic types) = 
     81 
     82== Tip number == 
     83 
     84Varijabla ovog tipa pretstavlja realan broj. Dozvoljene su 
     85sve aritmeticke i logicke operacije. Moguce je konvertovati 
     86sve tipove u number tip osim foreign tipa. 
     87 
     88== Tip text == 
     89 
     90Varijable ovog tipa pretstavlja tekst, neogranicene duzine. 
     91Dozvoljeno je sabiranje (spajanje) dva teksta preko operatora 
     92plus, kao i logicke operacije poredjenja. Moguce je konvertovati 
     93sve tipove u text tip osim foreign tipa. 
     94 
     95== Tip boolean == 
     96 
     97Varijabla 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 
     101Varijabla 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 
     103Moguce je konvertovati number i text tipove u date tip. 
     104        
     105== Tip time == 
     106 
     107Varijabla ovog tipa reprezentuje vreme koje moze biti pozitivno 
     108i negativno. Dozvoljene su aritmeticke operacije sabiranja i 
     109oduzima, kao i logicke operacije poredjenja. Moguce je 
     110konvertovati number i text tipove u time tip. 
     111        
     112== Tip array == 
     113 
     114{{{ 
     115a := { k1 := a1, k2 := a2, ..., kn := an } 
     116}}} 
     117 
     118gde 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 
     125Pokuš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 
     127Dozvoljene 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 
     135U prve četiri operacije a1 i a2 moraju biti nizovi. 
     136 
     137Nije dozvoljena konverzija bilo kojeg drugog tipa u niz. 
     138 
     139== Tip list == 
     140 
     141{{{ 
     142list:=[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 
     149gdje 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 
     151Pokušaj pristupa elementu koji ne postoji u listi je runtime greška. 
     152        
     153== Tip foreign == 
     154 
     155Foreign 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 
     157Mapirane metode se pozivaju na standardan način. Na primjer: 
     158 
     159{{{ 
     160var 
     161  f; 
     162 
     163  ... 
     164  f:=new("HTTP.Field").init("X-Engine", "m3w"); 
     165  ... 
     166}}} 
     167 
     168== Tip queue == 
     169 
     170Queue tip je objektni tip dizajniran za potrebe slanja poruka među threadovima, i to je standardni mehanizam za sinhronizaciju threadova. 
     171 
     172Trivijalan, koliko je moguće a da je i dalje smislen, primjer: 
     173 
     174{{{ 
     175#!html 
     176<a name="pinger.xl"> 
     177}}} 
     178{{{ 
     179module pingie; 
     180 
     181thread 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 
     195proc 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 
     212begin 
     213end pingie. 
     214 
     215}}} 
     216 
     217daje sljedeći rezultat: 
     218 
     219{{{ 
     220% xli pingie.xl 
     221Sending: 1 
     222Received: 1 
     223Sending: 2 
     224Received: 2 
     225Sending: 3 
     226Received: 3 
     227Ending adder 
     228}}}