Pristine Ack-5.5
[Ack-5.5.git] / lang / m2 / test / Thalmann / Shoes.mod
1 MODULE Shoes;
2
3 (* From: MODULA-2, An Introduction, by Daniel Thalmann, Springer-Verlag,
4          New York, 1985
5    Figure 21.3
6 *)
7
8   FROM SYSTEM IMPORT WORD, ADR, ADDRESS, NEWPROCESS, TRANSFER;
9   FROM InOut IMPORT Write, WriteLn;
10
11   CONST
12         WorkLength = 200;
13         MaxShoes = 50;
14         MaxDif = 6;
15
16   TYPE
17         WorkSpace = ARRAY [0..WorkLength-1] OF WORD;
18
19   VAR
20         NbLeft, NbRight : INTEGER;
21         WSLeft, WSRight : WorkSpace;
22         Left, Right, Main : ADDRESS;
23
24   PROCEDURE Leftp;
25   BEGIN
26         WHILE NbLeft < MaxShoes DO
27                 INC(NbLeft);
28                 Write("L");
29                 IF (NbLeft-NbRight>=MaxDif) OR (NbLeft>=MaxShoes) THEN
30                         TRANSFER(Left,Right);
31                 END;
32         END;
33         WriteLn;
34   END Leftp;
35
36   PROCEDURE Rightp;
37   BEGIN
38         WHILE NbRight < MaxShoes DO
39                 INC(NbRight);
40                 Write("R");
41                 IF (NbRight-NbLeft>=MaxDif) OR (NbRight>=MaxShoes) THEN
42                         TRANSFER(Right,Left);
43                 END;
44         END;
45         WriteLn;
46   END Rightp;
47
48 BEGIN
49         NbLeft := 0;
50         NbRight := 0;
51         NEWPROCESS(Leftp,ADR(WSLeft),SIZE(WSLeft),Left);
52         NEWPROCESS(Rightp,ADR(WSRight),SIZE(WSRight),Right);
53         TRANSFER(Main,Left);
54 END Shoes.