Az SR programozási nyelv

Példaprogramok

Ebben a fejezetben egy-kettő ismert, és a programozást oktató könyvekben nagyon gyakran használt példát próbáltunk összegyűjteni a teljesség igénye nélkül. (Megj.: Minden program egy erőforrás, melyet az erőforrás nevének megfelelő nevű .sr kiterjesztésű fájlba kell elhelyezni. Pl.: Ha hello az erőforrásunk neve, akkor ezt a hello.sr fájlba kell megírni!

A példaprogramok forráskódja letölthető innen (zip fájl).
Szerző neve: Laki Sándor
Készítés éve: 2006
Használt fordítóprogram: SR compiler

Hello world

A legelemibb program, már már elmaradhatatlan :-)

resource hello() write("Hello world") end

N-faktoriális

Számoljuk ki N faktoriálisát!

resource factorial() procedure fact(v: int) returns r: int if v = 1 -> r := 1 [] v > 1 -> r := v*fact(v-1) fi end var n: int writes("enter a positive integer: "); read(n) # itt bekérünk a std-inputról egy egész számot write("the factorial of", n, "is", fact(n)) end

Mátrix szorzás

Nos, ez már egészen szép kis program. Két mátrixot - A-t és B-t - szorzunk össze. Először mindkettőt a parancssori argumentumban megadott fájlokból betöltjük A és B NxN-es mátrixokba. Majd a process utasítás nxn db végrehajtási szálat hoz létre a C(i.j)-k számolására. A final blokk a matrix erőforrás befejeződésekor fut le. Jelen esetben, amikor minden compute process végzett a rábízott munkával.
A getarg(i,j) az i-edik parancssori argumentumot a j-be másolja.

resource matrix() # read command line arguments and open files var n: int; getarg(1, n) var namea: string[20]; getarg(2, namea) var nameb: string[20]; getarg(3, nameb) var filea := open(namea, READ) var fileb := open(nameb, READ) # declare and initialize matrices a, b, and c var a[1:n,1:n], b[1:n,1:n]: real var c[1:n,1:n]: real := ([n] ([n] 0.0) ) fa i := 1 to n, j := 1 to n -> read(filea, a[i,j]); read(fileb, b[i,j]) af # compute n**2 inner products in parallel process compute(i := 1 to n, j := 1 to n) fa k := 1 to n -> c[i,j] := c[i,j] + a[i,k]*b[k,j] af end final # print c, one row per line fa i := 1 to n -> fa j := 1 to n -> writes(c[i,j], " ") af write() # force new line af end end matrix

Stack

Ebben a fejezetben az adatabsztrakció egy esetére mutatunk példát. Eddig nem beszéltünk róla, de minden erőforrás egy működési sémát ír le, így alkalmas adatabsztrakcióra. Csak a főprogramhoz, a fő erőforráshoz jön létre automatikusan konkrét példány. Arról sem volt szó, hogy az erőforrások rendelkeznek egy interfésszel, publikus résszel. A példánkban ez a 1-5 sorok közötti rész. Itt típus definíciók, konstansdeklarációk és operációdeklarációk szerepelhetnek. Jelen esetben a push, pop függvényként hívhatók.

1 resource Stack 2 type result = enum(OK, OVERFLOW, UNDERFLOW) 3 op push(item: int) returns r: result 4 op pop(res item: int) returns r: result 5 body Stack(size: int) # discriminant!!!! 6 var store[1:size]: int, top: int := 0 7 proc push(item) returns r 8 if top store[++top] := item; r := OK 9 [] top=size -> r := OVERFLOW 10 fi 11 end 12 proc pop(item) returns r 13 if top>0 -> item := store[top--]; r := OK 14 [] top=0 -> r := UNDERFLOW 15 fi 16 end 17 end Stack

Nézzük hogyan tudjuk használni más egységből a vermünket:

1 resource Stack_User() 2 import Stack 3 var x: Stack.result 4 var s1, s2: cap Stack # Referenciát hozunk létre a Stackre 5 var y: int 6 s1 := create Stack(10); s2 := create Stack(20) # Itt jön létre a konkrét példány 7 ... 8 s1.push(4); s1.push(37); s2.push(98) 9 if (x := s1.pop(y)) != OK -> ... fi 10 if (x := s2.pop(y)) != OK -> ... fi 11 ... 12 end

Nézzük mit is kaptunk ezzel! Először is az import Stack -kel jelezzük, hogy használunk egy másik fordítási egységben levő erőforrást, nevezetesen a Stack-et. Az x változó típusa a Stack publikus részében definiált result felsorolási típus lesz. Látható, hogy pontozással/minősítéssel hivatkozhatunk ezen típusra. Eztán deklarálunk két capability-t a Stack-re. Ezek egyszerű referenciák lesznek. Kezdetben nincs hozzájuk objektum rendelve. A 6. sorban hozzuk létre a tényleges Stack-példányokat. Látható, hogy itt meg kell adni a diszkriminánsok konkrét értékeit. Az s1 10-es míg az s2 20-as méretű verem lesz. Ezek után az s1 és s2 -re alkalmazhatjuk a Stack publikus részében deklarált operációkat.(8-10.sor) Itt is a pontozott alak használatos.