Showcase.mod 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. MODULE Showcase;
  2. (* Tour of everything M2c + mcint can do so far (steps 1-6):
  3. scalars, control flow, procedures, composites, sets,
  4. pointers, strings, open arrays, I/O and a local MODULE. *)
  5. MODULE Stats
  6. EXPORT count, Bump, Limit;
  7. VAR
  8. count : INTEGER;
  9. CONST
  10. Limit = 100;
  11. PROCEDURE Bump;
  12. BEGIN
  13. count := count + 1
  14. END Bump;
  15. END Stats;
  16. TYPE
  17. Color = (Red, Green, Blue);
  18. Inner = RECORD u, v : INTEGER END;
  19. Pair = RECORD a : INTEGER; b : Inner END;
  20. Node = RECORD val : INTEGER; next : POINTER TO Node END;
  21. PNode = POINTER TO Node;
  22. VAR
  23. total, x, y, i, f, w, k : INTEGER;
  24. flag : BOOLEAN;
  25. ch : CHAR;
  26. col : Color;
  27. r : REAL;
  28. a, b : ARRAY [1 .. 5] OF INTEGER;
  29. m1, m2, m3 : ARRAY [1 .. 2], [1 .. 2] OF INTEGER;
  30. rec : Pair;
  31. s1, s2, u, n, d : SET OF [0 .. 15];
  32. head, spare : PNode;
  33. s, t, s1c : ARRAY [1 .. 10] OF CHAR;
  34. ExitCode : INTEGER;
  35. PROCEDURE Double(x : INTEGER) : INTEGER;
  36. BEGIN
  37. RETURN x * 2
  38. END Double;
  39. PROCEDURE Incr(VAR x : INTEGER);
  40. BEGIN
  41. x := x + 1
  42. END Incr;
  43. PROCEDURE Fact(n : INTEGER) : INTEGER;
  44. BEGIN
  45. IF n <= 1 THEN RETURN 1 ELSE RETURN n * Fact(n - 1) END
  46. END Fact;
  47. PROCEDURE IsEven(n : INTEGER) : BOOLEAN;
  48. FORWARD;
  49. PROCEDURE IsOdd(n : INTEGER) : BOOLEAN;
  50. BEGIN
  51. IF n = 0 THEN RETURN FALSE ELSE RETURN IsEven(n - 1) END
  52. END IsOdd;
  53. PROCEDURE IsEven(n : INTEGER) : BOOLEAN;
  54. BEGIN
  55. IF n = 0 THEN RETURN TRUE ELSE RETURN IsOdd(n - 1) END
  56. END IsEven;
  57. PROCEDURE Outer : INTEGER;
  58. PROCEDURE Inner : INTEGER;
  59. BEGIN
  60. RETURN 6
  61. END Inner;
  62. BEGIN
  63. RETURN Inner() + 1
  64. END Outer;
  65. PROCEDURE SumOpen(x : ARRAY OF INTEGER) : INTEGER;
  66. VAR i, s : INTEGER;
  67. BEGIN
  68. s := 0;
  69. FOR i := 0 TO HIGH(x) DO
  70. s := s + x[i]
  71. END;
  72. RETURN s
  73. END SumOpen;
  74. PROCEDURE Append(v : INTEGER);
  75. VAR q, r : PNode;
  76. BEGIN
  77. NEW(q);
  78. q^.val := v;
  79. q^.next := NIL;
  80. IF head = NIL THEN
  81. head := q
  82. ELSE
  83. r := head;
  84. WHILE r^.next # NIL DO
  85. r := r^.next
  86. END;
  87. r^.next := q
  88. END
  89. END Append;
  90. PROCEDURE ListSum(p : PNode) : INTEGER;
  91. BEGIN
  92. IF p = NIL THEN
  93. RETURN 0
  94. ELSE
  95. RETURN p^.val + ListSum(p^.next)
  96. END
  97. END ListSum;
  98. BEGIN
  99. total := 0;
  100. WriteString("tour");
  101. Stats.count := 0;
  102. Stats.Bump();
  103. Stats.Bump();
  104. Stats.Bump();
  105. total := total + Stats.count;
  106. IF Stats.Limit = 100 THEN
  107. total := total + 1
  108. END;
  109. x := 6 * 7 - 2;
  110. total := total + x DIV 10;
  111. y := x MOD 7;
  112. total := total + y;
  113. r := 3.5 + 2.25;
  114. IF (r > 5.0) AND (r < 6.0) THEN
  115. total := total + 2
  116. END;
  117. ch := "A";
  118. IF ch = "A" THEN
  119. total := total + 1
  120. END;
  121. IF ch < "B" THEN
  122. total := total + 1
  123. END;
  124. flag := (x > y) AND (y > 0);
  125. IF flag THEN
  126. total := total + 1
  127. END;
  128. flag := NOT flag OR FALSE;
  129. IF ~flag THEN
  130. total := total + 1
  131. END;
  132. col := Green;
  133. CASE col OF
  134. Red : total := total + 0 |
  135. Green : total := total + 3 |
  136. Blue : total := total + 5
  137. END;
  138. k := 2;
  139. CASE k OF
  140. 1 : total := total + 0 |
  141. 2 : total := total + 4
  142. ELSE
  143. total := total + 0
  144. END;
  145. i := 0; w := 0;
  146. WHILE i < 4 DO
  147. i := i + 1;
  148. w := w + i
  149. END;
  150. total := total + w DIV 5;
  151. i := 0;
  152. REPEAT
  153. i := i + 1
  154. UNTIL i >= 3;
  155. total := total + i;
  156. i := 0;
  157. LOOP
  158. i := i + 1;
  159. IF i = 3 THEN
  160. EXIT
  161. END
  162. END;
  163. total := total + i;
  164. f := 0;
  165. FOR i := 1 TO 5 DO
  166. f := f + i
  167. END;
  168. total := total + f MOD 10;
  169. IF x > 100 THEN
  170. total := total + 0
  171. ELSIF x > 10 THEN
  172. total := total + 2
  173. ELSE
  174. total := total + 0
  175. END;
  176. total := total + Double(21) DIV 10;
  177. Incr(x);
  178. total := total + x MOD 10;
  179. total := total + Fact(5) DIV 100;
  180. IF IsEven(10) THEN
  181. total := total + 1
  182. END;
  183. total := total + Outer();
  184. a[1] := 5; a[2] := 4; a[3] := 3; a[4] := 2; a[5] := 1;
  185. b := a;
  186. total := total + b[1];
  187. total := total + HIGH(a);
  188. total := total + SumOpen(a);
  189. m1[1,1] := 1; m1[1,2] := 2; m1[2,1] := 3; m1[2,2] := 4;
  190. m2[1,1] := 5; m2[1,2] := 6; m2[2,1] := 7; m2[2,2] := 8;
  191. m3[1,1] := m1[1,1]*m2[1,1] + m1[1,2]*m2[2,1];
  192. m3[1,2] := m1[1,1]*m2[1,2] + m1[1,2]*m2[2,2];
  193. m3[2,1] := m1[2,1]*m2[1,1] + m1[2,2]*m2[2,1];
  194. m3[2,2] := m1[2,1]*m2[1,2] + m1[2,2]*m2[2,2];
  195. total := total + (m3[1,1] + m3[2,2]) MOD 20;
  196. rec.a := 1;
  197. rec.b.u := 10;
  198. rec.b.v := 20;
  199. WITH rec DO
  200. a := a + 1;
  201. WITH b DO
  202. u := u + 2;
  203. v := v + 3
  204. END
  205. END;
  206. total := total + rec.a + rec.b.u + rec.b.v;
  207. s1 := {1 .. 5};
  208. s2 := {4 .. 8};
  209. u := s1 + s2;
  210. n := s1 * s2;
  211. d := s1 - s2;
  212. IF (1 IN u) AND (5 IN n) AND (2 IN d) THEN
  213. total := total + 5
  214. END;
  215. IF u = u THEN
  216. total := total + 1
  217. END;
  218. head := NIL;
  219. Append(4);
  220. Append(7);
  221. Append(9);
  222. total := total + ListSum(head);
  223. NEW(spare);
  224. DISPOSE(spare);
  225. s := "ok";
  226. t := "ok";
  227. IF s = t THEN
  228. total := total + 2
  229. END;
  230. WriteString(s);
  231. t := "abc";
  232. IF t # s THEN
  233. total := total + 1
  234. END;
  235. IF s > t THEN
  236. total := total + 1
  237. END;
  238. s1c := "okx";
  239. IF s1c > s THEN
  240. total := total + 1
  241. END;
  242. WriteInt(total);
  243. ExitCode := total
  244. END Showcase.