Showcase.LST 6.8 KB

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