Initial revision
This commit is contained in:
parent
cc60420184
commit
32be4760cd
193
lang/occam/test/Huffman.ocm
Normal file
193
lang/occam/test/Huffman.ocm
Normal file
|
@ -0,0 +1,193 @@
|
|||
def
|
||||
bits.in.character = 8,
|
||||
number.of.characters= 1 << bits.in.character,
|
||||
number.of.codes = number.of.characters + 1,
|
||||
character.mask = not ((not 0) << bits.in.character):
|
||||
|
||||
def
|
||||
root = 0, size.of.tree = (2* number.of.codes)-1, not.a.node = size.of.tree:
|
||||
|
||||
var
|
||||
escape, weight[size.of.tree],
|
||||
children[size.of.tree], parent[size.of.tree],
|
||||
character[size.of.tree], representative[number.of.characters] :
|
||||
|
||||
proc construct.tree =
|
||||
-- Create a tree for the encoding in which every character is escaped
|
||||
seq
|
||||
escape := root
|
||||
weight[escape] := 1
|
||||
children[escape] := root -- it is a leaf
|
||||
seq ch= [0 for number.of.characters]
|
||||
representative[ch] := not.a.node :
|
||||
|
||||
proc create.leaf(var new.leaf, value ch) =
|
||||
-- Extend the tree by fision of the escape leaf into two new leaves
|
||||
var new.escape:
|
||||
seq
|
||||
new.leaf := escape + 1
|
||||
new.escape := escape + 2
|
||||
|
||||
children[escape] := new.leaf -- escape is the new parent
|
||||
|
||||
weight[new.leaf] := 0
|
||||
children[new.leaf] := root
|
||||
parent[new.leaf] := escape
|
||||
character[new.leaf] := ch
|
||||
representative[ch /\ character.mask] := new.leaf
|
||||
|
||||
weight[new.escape] := 1
|
||||
children[new.escape]:= root
|
||||
parent[new.escape] := escape
|
||||
|
||||
escape := new.escape :
|
||||
|
||||
proc swap.trees(value i, j) =
|
||||
-- Exchange disjoint sub-trees routed at i and j
|
||||
proc swap.words(var p,q) =
|
||||
-- Exchange values stored in p and q
|
||||
var t:
|
||||
seq
|
||||
t := p
|
||||
p := q
|
||||
q := t :
|
||||
|
||||
proc adjust.offspring(value i) =
|
||||
-- Restore downstream pointers to node i
|
||||
if
|
||||
children[i] = root
|
||||
representative[character[i] /\ character.mask] := i
|
||||
children[i] <> root
|
||||
seq child=[children[i] for 2]
|
||||
parent[child] := i :
|
||||
|
||||
seq
|
||||
swap.words(children[i], children[j])
|
||||
swap.words(character[i], character[j])
|
||||
adjust.offspring(i)
|
||||
adjust.offspring(j) :
|
||||
|
||||
proc increment.frequency(value ch) =
|
||||
-- Adjust the weights of all relevant nodes to account for one more occurence
|
||||
-- of the character ch, and adjust the shape of the tree if necessary
|
||||
var node:
|
||||
seq
|
||||
if
|
||||
representative[ch /\ character.mask] <> not.a.node
|
||||
node := representative[ch /\ character.mask]
|
||||
representative[ch /\ character.mask] = not.a.node
|
||||
create.leaf(node, ch)
|
||||
while node <> root
|
||||
if
|
||||
weight[node-1] > weight[node]
|
||||
seq
|
||||
weight[node] := weight[node] + 1
|
||||
node := parent[node]
|
||||
weight[node-1] = weight[node]
|
||||
if i= [1 for (node-root)-1]
|
||||
weight[(node-i)-1] > weight[node]
|
||||
seq
|
||||
swap.trees(node, node-i)
|
||||
node := node-i
|
||||
weight[root] := weight[root] + 1 :
|
||||
|
||||
proc encode.character(chan output, value ch) =
|
||||
-- Transmit the encoding of ch along output
|
||||
def size.of.encoding = bits.in.character + (number.of.codes - 1) :
|
||||
var encoding[size.of.encoding], length, node:
|
||||
seq
|
||||
if
|
||||
representative[ch /\ character.mask] <> not.a.node
|
||||
seq
|
||||
length := 0
|
||||
node := representative[ch /\ character.mask]
|
||||
representative[ch /\ character.mask] = not.a.node
|
||||
seq
|
||||
seq i=[0 for bits.in.character]
|
||||
encoding[i] := (ch >> i) /\ 1 -- i'th bit of unencoded ch
|
||||
length := bits.in.character
|
||||
node := escape
|
||||
while node <> root
|
||||
seq
|
||||
encoding[length] := node - children[parent[node]]
|
||||
length := length + 1
|
||||
node := parent[node]
|
||||
seq i= [1 for length]
|
||||
output ! encoding[length-i] :
|
||||
|
||||
proc decode.character(chan input, var ch) =
|
||||
-- Receive an encoding along input and store the corresponding character in ch
|
||||
var node:
|
||||
seq
|
||||
node := root
|
||||
while children[node] <> root
|
||||
var bit:
|
||||
seq
|
||||
input ? bit
|
||||
node := children[node] + bit
|
||||
if
|
||||
node < escape
|
||||
ch := character[node]
|
||||
node = escape
|
||||
var bit:
|
||||
seq
|
||||
input ? bit
|
||||
ch := -bit
|
||||
seq i= [2 for bits.in.character - 1]
|
||||
seq
|
||||
input ? bit
|
||||
ch := (ch << 1) \/ bit :
|
||||
|
||||
def end.of.message = -1:
|
||||
|
||||
proc copy.encoding(chan source, sink) =
|
||||
-- Read a stream of characters from source, until signalled on end.of.source,
|
||||
-- and transmit their encodings in sequence along sink, followed by that of
|
||||
-- end.of.message, maintaining throughout the encoding tree for the encoding
|
||||
-- determined by the cumulative frequencies of the characters transmitted
|
||||
var more.characters.expected:
|
||||
seq
|
||||
construct.tree
|
||||
more.characters.expected := true
|
||||
while more.characters.expected
|
||||
var ch:
|
||||
seq
|
||||
source ? ch
|
||||
if
|
||||
ch <> end.of.message
|
||||
seq
|
||||
encode.character(sink, ch)
|
||||
increment.frequency(ch)
|
||||
ch = end.of.message
|
||||
more.characters.expected := false
|
||||
encode.character(sink, end.of.message) :
|
||||
|
||||
proc copy.decoding(chan source, sink) =
|
||||
-- Read the encodings of a stream of characters, up to and including the
|
||||
-- encoding of end.of.message, from source and transmit the corresponding
|
||||
-- characters along sink, maintaining the encoding tree for encoding
|
||||
-- determined by the cumulative frequencies of the characters received
|
||||
var more.characters.expected:
|
||||
seq
|
||||
construct.tree
|
||||
more.characters.expected := true
|
||||
while more.characters.expected
|
||||
var ch:
|
||||
seq
|
||||
decode.character(source, ch)
|
||||
if
|
||||
ch <> end.of.message
|
||||
seq
|
||||
sink ! ch
|
||||
increment.frequency(ch)
|
||||
ch = end.of.message
|
||||
more.characters.expected:=false :
|
||||
|
||||
var choose:
|
||||
seq
|
||||
input ? choose
|
||||
if
|
||||
choose='e'
|
||||
copy.encoding(input, output)
|
||||
choose='d'
|
||||
copy.decoding(input, output)
|
1
lang/occam/test/READ_ME
Normal file
1
lang/occam/test/READ_ME
Normal file
|
@ -0,0 +1 @@
|
|||
This directory only contains some Occam programs, not a testset.
|
25
lang/occam/test/aatob.ocm
Normal file
25
lang/occam/test/aatob.ocm
Normal file
|
@ -0,0 +1,25 @@
|
|||
def otherwise=true:
|
||||
|
||||
proc xxtoy(chan in, out, value x, y)=
|
||||
var c:
|
||||
seq
|
||||
c:= not EOF
|
||||
while c<>EOF
|
||||
seq
|
||||
in ? c
|
||||
if
|
||||
c=x
|
||||
seq
|
||||
in ? c
|
||||
if
|
||||
c=x
|
||||
out ! y
|
||||
otherwise
|
||||
out ! x; c
|
||||
otherwise
|
||||
out ! c
|
||||
:
|
||||
chan link:
|
||||
par
|
||||
xxtoy(input, link, 'a', 'b')
|
||||
xxtoy(link, output, 'b', 'c')
|
26
lang/occam/test/copy.ocm
Normal file
26
lang/occam/test/copy.ocm
Normal file
|
@ -0,0 +1,26 @@
|
|||
def N=10:
|
||||
|
||||
proc copy(chan in, out)=
|
||||
var char:
|
||||
seq
|
||||
char:='x'
|
||||
while char<>EOF
|
||||
seq
|
||||
in ? char
|
||||
out ! char
|
||||
:
|
||||
|
||||
chan junk[N]:
|
||||
par
|
||||
copy(input, junk[0])
|
||||
|
||||
par i=[0 FOR N-1]
|
||||
copy(junk[i], junk[i+1])
|
||||
|
||||
var char:
|
||||
seq
|
||||
junk[N-1] ? char
|
||||
while char<>EOF
|
||||
seq
|
||||
output ! char
|
||||
junk[N-1] ? char
|
14
lang/occam/test/key.ocm
Normal file
14
lang/occam/test/key.ocm
Normal file
|
@ -0,0 +1,14 @@
|
|||
#include "dec.ocm"
|
||||
var ch:
|
||||
seq
|
||||
output ! RAW
|
||||
|
||||
input ? ch
|
||||
|
||||
seq i=[0 for 10]
|
||||
seq
|
||||
decout(output, ch, 0)
|
||||
output ! '*n'
|
||||
input ? ch
|
||||
|
||||
output ! TEXT
|
248
lang/occam/test/lifegame.ocm
Normal file
248
lang/occam/test/lifegame.ocm
Normal file
|
@ -0,0 +1,248 @@
|
|||
def otherwise=true:
|
||||
|
||||
def dead=0, alive= not dead:
|
||||
|
||||
def radius=1,
|
||||
diameter= (2*radius)+1,
|
||||
neighbours= (diameter*diameter)-1:
|
||||
|
||||
proc calculate.next.state(chan link[], value in[], state, var next.state)=
|
||||
var count:
|
||||
seq
|
||||
var state.of.neighbour[neighbours]:
|
||||
seq
|
||||
par i=[0 for neighbours]
|
||||
link[in[i]] ? state.of.neighbour[i]
|
||||
count:=0
|
||||
seq i=[0 for neighbours]
|
||||
if
|
||||
state.of.neighbour[i]=alive
|
||||
count:=count+1
|
||||
state.of.neighbour[i]=dead
|
||||
skip
|
||||
if
|
||||
count<2
|
||||
next.state:=dead
|
||||
count=2
|
||||
next.state:=state
|
||||
count=3
|
||||
next.state:=alive
|
||||
count>3
|
||||
next.state:=dead
|
||||
:
|
||||
|
||||
proc broadcast.present.state(chan link[], value out[], state)=
|
||||
par i=[0 for neighbours]
|
||||
link[out[i]] ! state
|
||||
:
|
||||
|
||||
def set.state=1, ask.state=2, terminate=3:
|
||||
|
||||
proc cell(chan link[], value in[], out[], chan control, sense)=
|
||||
var state, instruction:
|
||||
seq
|
||||
state:=dead
|
||||
control ? instruction
|
||||
while instruction <> terminate
|
||||
seq
|
||||
if
|
||||
instruction=set.state
|
||||
control ? state
|
||||
instruction=ask.state
|
||||
var next.state:
|
||||
seq
|
||||
par
|
||||
broadcast.present.state(link, out, state)
|
||||
seq
|
||||
calculate.next.state(link, in, state,
|
||||
next.state)
|
||||
sense ! (state<>next.state); next.state
|
||||
|
||||
state:=next.state
|
||||
|
||||
control ? instruction
|
||||
:
|
||||
|
||||
def array.width=5, array.height=5:
|
||||
def number.of.cells=array.height*array.width,
|
||||
number.of.links=neighbours*number.of.cells:
|
||||
|
||||
proc initialize(value x, y, var in[], out[])=
|
||||
seq delta.x=[-radius for diameter]
|
||||
seq delta.y=[-radius for diameter]
|
||||
var direction:
|
||||
seq
|
||||
direction:=delta.x+(diameter*delta.y)
|
||||
if
|
||||
direction<>0
|
||||
var index, process:
|
||||
seq
|
||||
process:=x+(array.width*y)
|
||||
index:=(neighbours+direction) \ (neighbours+1)
|
||||
out[index]:=index+(neighbours*process)
|
||||
|
||||
process:=((x+delta.x+array.width) \ array.width) +
|
||||
(array.width*
|
||||
((y+delta.y+array.height) \ array.height))
|
||||
index:=(neighbours-direction) \ (neighbours+1)
|
||||
in[index]:=index+(neighbours*process)
|
||||
direction=0
|
||||
skip
|
||||
:
|
||||
|
||||
def control= not ((not 0)<<5), escape=control/\'[':
|
||||
|
||||
proc move.cursor(chan screen, value x, y)=
|
||||
screen ! escape; '='; '*s'+y; '*s'+x
|
||||
:
|
||||
|
||||
proc initialize.display(chan screen)=
|
||||
screen ! control /\ 'Z'
|
||||
:
|
||||
|
||||
proc clean.up.display(chan screen)=
|
||||
move.cursor(screen, 0, array.height)
|
||||
:
|
||||
|
||||
proc display.state(chan screen, value x, y, state)=
|
||||
seq
|
||||
move.cursor(screen, x, y)
|
||||
if
|
||||
state=alive
|
||||
screen ! '**'
|
||||
state=dead
|
||||
screen ! '*s'
|
||||
:
|
||||
|
||||
proc generation(chan screen, control[], sense[], var active)=
|
||||
seq
|
||||
seq cell=[0 for number.of.cells]
|
||||
control[cell] ! ask.state
|
||||
active:=false
|
||||
seq cell=[0 for number.of.cells]
|
||||
var changed, next.state:
|
||||
seq
|
||||
sense[cell] ? changed; next.state
|
||||
if
|
||||
changed
|
||||
seq
|
||||
display.state(screen, cell\array.width,
|
||||
cell/array.width, next.state)
|
||||
active:=true
|
||||
not changed
|
||||
skip
|
||||
:
|
||||
|
||||
proc edit(chan keyboard, screen, control[])=
|
||||
def ctrl= not ((not 0)<<5):
|
||||
def left.key= 'h', right.key= 'l', up.key= 'k', down.key= 'j',
|
||||
uproot.key= '*s', plant.key= '**', plant.key2= '8':
|
||||
var x, y, editing, ch:
|
||||
seq
|
||||
x:=array.width/2
|
||||
y:=array.height/2
|
||||
editing:=true
|
||||
while editing
|
||||
seq
|
||||
move.cursor(screen, x, y)
|
||||
keyboard ? ch
|
||||
if
|
||||
(ch=left.key) and (x>0)
|
||||
x:=x-1
|
||||
(ch=right.key) and (x<(array.width-1))
|
||||
x:=x+1
|
||||
(ch=up.key) and (y>0)
|
||||
y:=y-1
|
||||
(ch=down.key) and (y<(array.height-1))
|
||||
y:=y+1
|
||||
(ch=uproot.key) or (ch=plant.key) or (ch=plant.key2)
|
||||
var state:
|
||||
seq
|
||||
state:=(dead /\ (ch=uproot.key)) \/
|
||||
(alive /\ ((ch=plant.key) or (ch=plant.key2)))
|
||||
control[x+(array.width*y)] ! set.state; state
|
||||
display.state(screen, x, y, state)
|
||||
(ch='q') or (ch='Q')
|
||||
editing:=false
|
||||
otherwise
|
||||
skip
|
||||
:
|
||||
|
||||
def idle=1, editing=2, single.stepping=3, free.running=4, terminated=5:
|
||||
|
||||
proc display.activity(chan screen, value activity)=
|
||||
seq
|
||||
move.cursor(screen, array.width+1, array.height+2)
|
||||
|
||||
proc write.string(value str[])=
|
||||
seq i=[1 for str[byte 0]]
|
||||
screen ! str[byte i]
|
||||
:
|
||||
if
|
||||
activity=idle
|
||||
write.string("Idle")
|
||||
activity=editing
|
||||
write.string("Edit")
|
||||
activity=single.stepping
|
||||
write.string("Step")
|
||||
activity=free.running
|
||||
write.string("Busy")
|
||||
activity=terminated
|
||||
write.string("Done")
|
||||
:
|
||||
|
||||
proc controller(chan keyboard, screen, control[], sense[])=
|
||||
var activity:
|
||||
seq
|
||||
activity:=idle
|
||||
initialize.display(screen)
|
||||
while activity<>terminated
|
||||
seq
|
||||
display.activity(screen, activity)
|
||||
var ch:
|
||||
pri alt
|
||||
(activity <> editing) & keyboard ? ch
|
||||
if
|
||||
(ch='q') or (ch='Q')
|
||||
activity:=terminated
|
||||
(ch='i') or (ch='I')
|
||||
activity:=idle
|
||||
(ch='e') or (ch='E')
|
||||
activity:=editing
|
||||
(ch='r') or (ch='R')
|
||||
activity:=free.running
|
||||
(ch='s') or (ch='S')
|
||||
activity:=single.stepping
|
||||
(activity=editing) & skip
|
||||
seq
|
||||
edit(keyboard, screen, control)
|
||||
activity:=idle
|
||||
(activity=free.running) or (activity=single.stepping) & skip
|
||||
var changing:
|
||||
seq
|
||||
generation(screen, control, sense, changing)
|
||||
if
|
||||
(activity=single.stepping) or (not changing)
|
||||
activity:=idle
|
||||
(activity=free.running) and changing
|
||||
skip
|
||||
display.activity(screen, activity)
|
||||
seq cell=[0 for number.of.cells]
|
||||
control[cell] ! terminate
|
||||
clean.up.display(screen)
|
||||
:
|
||||
|
||||
chan link[number.of.links], control[number.of.cells], sense[number.of.cells]:
|
||||
seq
|
||||
output ! RAW
|
||||
par
|
||||
controller(input, output, control, sense)
|
||||
|
||||
par x=[0 for array.width]
|
||||
par y=[0 for array.height]
|
||||
var in[neighbours], out[neighbours]:
|
||||
seq
|
||||
initialize(x, y, in, out)
|
||||
cell(link, in, out, control[x+(array.width*y)],
|
||||
sense[x+(array.width*y)])
|
||||
output ! TEXT
|
98
lang/occam/test/matmul.ocm
Normal file
98
lang/occam/test/matmul.ocm
Normal file
|
@ -0,0 +1,98 @@
|
|||
#include "dec.ocm"
|
||||
|
||||
proc prompt(value str[])=
|
||||
seq i=[1 for str[byte 0]]
|
||||
output ! str[byte i]
|
||||
:
|
||||
def N=20 :
|
||||
|
||||
var n:
|
||||
var A[N*N], x[N], k[N], y[N] :
|
||||
|
||||
proc initialise=
|
||||
var c:
|
||||
seq
|
||||
prompt("n?*n")
|
||||
c:='*s'
|
||||
decin(input, n, c)
|
||||
|
||||
prompt("A?*n")
|
||||
seq i= [0 for n]
|
||||
seq j= [0 for n]
|
||||
decin(input, A[(i*n)+j], c)
|
||||
|
||||
prompt("x?*n")
|
||||
seq i= [0 for n]
|
||||
decin(input, x[i], c)
|
||||
|
||||
prompt("k?*n")
|
||||
seq i= [0 for n]
|
||||
decin(input, k[i], c) :
|
||||
|
||||
proc produce.xj(value j, chan south) =
|
||||
-- north row: source of x values
|
||||
while true
|
||||
south ! x[j] :
|
||||
|
||||
proc consume.yi(value i, chan east) =
|
||||
-- west column: read y values
|
||||
east ? y[i] :
|
||||
|
||||
proc offset(value ki, chan west) =
|
||||
-- east column: source of k offsets
|
||||
while true
|
||||
west ! ki :
|
||||
|
||||
proc multiplier(value aij, chan north, south, west, east) =
|
||||
-- middle: responsible for a values
|
||||
var xj, aij.times.xj, yi :
|
||||
seq
|
||||
north ? xj
|
||||
while true
|
||||
seq
|
||||
par
|
||||
south ! xj
|
||||
aij.times.xj:= aij*xj
|
||||
east ? yi
|
||||
par
|
||||
west ! yi+aij.times.xj
|
||||
north ? xj :
|
||||
|
||||
proc sink(chan north) =
|
||||
-- south row: sink for unused outputs
|
||||
while true
|
||||
north ? any :
|
||||
|
||||
seq
|
||||
initialise
|
||||
|
||||
chan north.south[(N+1)*N], east.west[N*(N+1)] :
|
||||
par
|
||||
par j= [0 for n] -- producer of co-ordinates x[j]
|
||||
produce.xj(j, north.south[j])
|
||||
|
||||
par -- the matrix multiplier
|
||||
par i= [0 for n]
|
||||
offset(k[i], east.west[(n*n)+i])
|
||||
par i= [0 for n]
|
||||
par j= [0 for n]
|
||||
multiplier(A[(n*i)+j],
|
||||
north.south[(n*i)+j],
|
||||
north.south[(n*(i+1))+j],
|
||||
east.west[i+(n*j)],
|
||||
east.west[i+(n*(j+1))])
|
||||
par j= [0 for n]
|
||||
sink(north.south[(n*n)+j])
|
||||
|
||||
seq
|
||||
par i= [0 for n]-- consumer of transformed co-ordinates
|
||||
consume.yi(i, east.west[i])
|
||||
|
||||
seq i= [0 for n]
|
||||
seq
|
||||
output ! 'y'; '['
|
||||
decout(output, i, 0)
|
||||
output ! ']'; '='
|
||||
decout(output, y[i], 5)
|
||||
output ! '*n'
|
||||
exit(0)
|
49
lang/occam/test/sort.ocm
Normal file
49
lang/occam/test/sort.ocm
Normal file
|
@ -0,0 +1,49 @@
|
|||
-- This file contains a recursive call to sorter, so this is not really Occam.
|
||||
#include "dec.ocm"
|
||||
|
||||
var c:
|
||||
seq
|
||||
c:='*s'
|
||||
proc comparator(value num, chan in, out)=
|
||||
var old.num, new.num:
|
||||
seq
|
||||
old.num:=num
|
||||
in ? new.num
|
||||
while new.num
|
||||
seq
|
||||
in ? new.num
|
||||
if
|
||||
new.num<=old.num
|
||||
out ! true; new.num
|
||||
new.num>old.num
|
||||
seq
|
||||
out ! true; old.num
|
||||
old.num:=new.num
|
||||
in ? new.num
|
||||
out ! true; old.num; false
|
||||
:
|
||||
proc sorter(chan out)=
|
||||
chan in:
|
||||
var num:
|
||||
seq
|
||||
decin(input, num, c)
|
||||
if
|
||||
c<0
|
||||
out ! false
|
||||
c>=0
|
||||
par
|
||||
sorter(in)
|
||||
comparator(num, in, out)
|
||||
:
|
||||
chan out:
|
||||
var num:
|
||||
par
|
||||
sorter(out)
|
||||
seq
|
||||
out ? num
|
||||
while num
|
||||
seq
|
||||
out ? num
|
||||
decout(output, num, 0)
|
||||
output ! '*n'
|
||||
out ? num
|
24
lang/occam/test/tst.ocm
Normal file
24
lang/occam/test/tst.ocm
Normal file
|
@ -0,0 +1,24 @@
|
|||
#include <dec.ocm>
|
||||
#include <prints.ocm>
|
||||
|
||||
var fmt[byte 100]:
|
||||
var d, c:
|
||||
seq
|
||||
input ? c
|
||||
decin(input, d, c)
|
||||
while c<>EOF
|
||||
seq
|
||||
chan link:
|
||||
par
|
||||
printd(link, "XXXX %%%ds XXXXX*#00", d)
|
||||
var c, i:
|
||||
seq
|
||||
i:=0
|
||||
link ? c
|
||||
while c<>0
|
||||
seq
|
||||
i:=i+1
|
||||
fmt[byte i]:=c
|
||||
link ? c
|
||||
prints("XXXX %s XXXXX", "YYYYY")
|
||||
decin(input, d, c)
|
17
lang/occam/test/use_prnt.ocm
Normal file
17
lang/occam/test/use_prnt.ocm
Normal file
|
@ -0,0 +1,17 @@
|
|||
#include <dec.ocm>
|
||||
#include <printd.ocm>
|
||||
|
||||
seq
|
||||
printd(output, "philosopher %d eats ice*n", 2048)
|
||||
printd(output, "phil. %20d also*n", 65536)
|
||||
chan link:
|
||||
par
|
||||
printd(link, "%d times %d makes 100*n", 10)
|
||||
|
||||
var c:
|
||||
seq
|
||||
c:='x'
|
||||
while c<>'*n'
|
||||
seq
|
||||
link ? c
|
||||
output ! c
|
32
lang/occam/test/xxtoy.ocm
Normal file
32
lang/occam/test/xxtoy.ocm
Normal file
|
@ -0,0 +1,32 @@
|
|||
def otherwise=true:
|
||||
|
||||
def NLET= ('z'-'a')+1:
|
||||
|
||||
proc xxtoy(chan in, out, value x, y)=
|
||||
var c:
|
||||
seq
|
||||
c:= not EOF
|
||||
while c<>EOF
|
||||
seq
|
||||
in ? c
|
||||
if
|
||||
c=x
|
||||
seq
|
||||
in ? c
|
||||
if
|
||||
c=x
|
||||
out ! y
|
||||
otherwise
|
||||
out ! x; c
|
||||
otherwise
|
||||
out ! c
|
||||
:
|
||||
chan link[NLET-1]:
|
||||
|
||||
par
|
||||
xxtoy(input, link[0], 'a', 'b')
|
||||
|
||||
par i=[0 for NLET-2]
|
||||
xxtoy(link[i], link[i+1], i+'b', i+'c')
|
||||
|
||||
xxtoy(link[NLET-2], output, 'y', 'z')
|
Loading…
Reference in a new issue