User guide
3.7. COROUTINE EXAMPLES 87
LET tee(args) BE // Body of TEE1 and TEE2
{ LET in, out = args!0, args!1
cowait() // End of initialisation.
{ LET val = callco(in, 0)
callco(out, val)
cowait(val)
} REPEAT
}
AND mul(args) BE // Body of X2, X3 and X5
{ LET k, in = args!0, args!1
cowait() // End of initialisation.
cowait(k * callco(in, 0)) REPEAT
}
LET merge(args) BE // Body of MER1 and MER2
{ LET inx, iny = args!0, args!1
LET x, y, min = 0, 0, 0
cowait() // End of initialisation
{ IF x=min DO x := callco(inx, 0)
IF y=min DO y := callco(iny, 0)
min := x<y -> x, y
cowait(min)
} REPEAT
}
LET start() = VALOF
{ LET BUF1 = initco(buf, 500)
LET BUF2 = initco(buf, 500)
LET BUF3 = initco(buf, 500)
LET TEE1 = initco(tee, 100, BUF1, BUF2)
LET TEE2 = initco(tee, 100, BUF2, BUF3)
LET X2 = initco(mul, 100, 2, TEE1)
LET X3 = initco(mul, 100, 3, TEE2)
LET X5 = initco(mul, 100, 5, BUF3)
LET MER1 = initco(merge, 100, X2, X3)
LET MER2 = initco(merge, 100, MER1, X5)
LET val = 1
FOR i = 1 TO 100 DO { writef(" %i6", val)
IF i REM 10 = 0 DO newline()
callco(BUF1, val)
val := callco(MER2)
}
deleteco(BUF1); deleteco(BUF2); deleteco(BUF3)
deleteco(TEE1); deleteco(TEE2)
deleteco(X2); deleteco(X3); deleteco(X5)
deleteco(MER1); deleteco(MER2)
RESULTIS 0
}