A Joyce programozási nyelv

Példák

Egyszerű streameket használó programok

type stream = [ int(integer),eos];
innentől a csatornákon lévő adatok az int szóval prefixelt integer számok és a végén egy eos szignál jön.

Generáló program

Generál egy a számtani sorozatot a 0-dik tagjától az n-1-dik tagjáig, ahol ai=a+i*b és ezt egy csatornára teszi (az adatokat egy eos szignál zárja).

agent generate(out: stream,a,b,n:integer); var i:integer; begin i:=0; while i<n do begin out!int(a+i*b);i:=i+1 end; out!eos end;

Másoló program

Az input csatornán lévő adatokat átmásolja az output csatornára.

agent copy(inp,out:stream); var more:boolean; x: integer; begin more:=true; while more do poll inp?int(x) ->out!int(x) | inp?eos -> more :=false end; out!eos end;

Összefésülő program

A két input csatornán lévő adatokat az output csatornára írja. Az adatok sorrendje csak annyiban meghatározott, hogy ha egy adat az egyik input csatornáról jött akkor az őt követő ugyanarról a csatornáról jövő adatok az output csatornán is később következnek.

agent merge(inp1,inp2,out:stream); var n,x:integer; begin n:=0; while n<2 do poll inp1?int(x) -> out!int(x) | inp1?eos -> n:=n+1 | inp2?int(x) -> out!int(x) | inp2?eos -> n:=n+1 end; out!eos end;

Egyszerűsítő program

Egy olyan csatornából, amin az adatok monoton növekvő sorrendben következnek egymás után, csinál egy olyat amin szigorúan monoton növekvő sorrendben következnek egymás után. Kiszűri azokat az adatokat, amik többször szerepelnek az inputban, és csak egyszer írja ki őket az outputra.

agent suppress(inp,out:stream); var more: boolean; x,y:integer; begin poll inp?int(x) -> more :=true | inp?eos -> more :=false end; while more do poll inp?int(y) -> if x<>y then begin out!int(x); x:=y end | inp?eos -> out!int(x) more:=false end; out!eos end;

Iteratív buffer

A buffert 10 csatornával reprezentáljuk, amik egymásról másolják az adatokat.

agent buffer(inp,out:stream); const n=9; type net = array [1..n] of stream; use copy; var a:net; i:integer; begin +a[1];copy(inp,a[1]); i:=2; while i<=n do begin +a[i];copy(a[i-1],a[i]); i:=i+1 end; copy(a[n],out) end;

Rekurzív buffer

Ugyanaz, mint az előbb csak most rekurzívan.

agent buffer(n:integer;inp,out:stream); use copy; var succ:stream; begin if n=1 then copy (inp,out) else begin +succ;copy(inp,succ); buffer(n-1,succ,out) end end;

Rekurzív rendezés

Működése a következő, ha a csatornán van még adat, akkor a csatornáról kiválasztja a legkisebb elemet, a többit meg egy közbeeső csatornára továbbítja, amire alkalmazza a rekurzív rendezést, a megszerzett legkisebb adatot pedig kiírja az output csatornára, ha nincs több adat, akkor befejezi a futását.

agent sort(inp,out:stream); var more:boolen; x,y:integer; succ:stream; begin poll inp?int(x)-> +succ; sort(succ,out); more:=true | inp?eos->out!eos; more=false end; while more do poll inp?int(y)-> if x>y then begin succ!int(x);x:=y end else succ!int(y) | inp?eos -> out!int(x); succ!eos; more:=false end end;