|
|
@@ -0,0 +1,66 @@
|
|
|
+MODULE Showcase25;
|
|
|
+// Showcase of the latest language additions:
|
|
|
+// * dynamic SET OF CARDINAL and SET OF INTEGER (sorted range lists),
|
|
|
+// * a bounded wide set (SET OF [0..100000]) using the inline form,
|
|
|
+// * set union/intersection/difference and INCL/EXCL/IN,
|
|
|
+// * ADDRESS/pointer equality (ADR(p^) = p).
|
|
|
+// Prints a summary and exits 42.
|
|
|
+IMPORT SysIO;
|
|
|
+
|
|
|
+TYPE
|
|
|
+ CardSet = SET OF CARDINAL;
|
|
|
+ IntSet = SET OF INTEGER;
|
|
|
+ Wide = SET OF [0..100000];
|
|
|
+
|
|
|
+VAR
|
|
|
+ a, b, c : CardSet;
|
|
|
+ i : IntSet;
|
|
|
+ w : Wide;
|
|
|
+ p : POINTER TO INTEGER;
|
|
|
+ addr : ADDRESS;
|
|
|
+ total : INTEGER;
|
|
|
+ ExitCode : INTEGER;
|
|
|
+
|
|
|
+BEGIN
|
|
|
+ total := 0;
|
|
|
+
|
|
|
+ (* dynamic cardinal sets: a = {1,3,65535}, b = {1,3,5} *)
|
|
|
+ a := CardSet{};
|
|
|
+ INCL(a, 1); INCL(a, 3); INCL(a, 65535);
|
|
|
+ b := CardSet{1, 3, 5};
|
|
|
+ IF (1 IN a) AND (3 IN a) AND (65535 IN a) AND NOT (2 IN a) THEN
|
|
|
+ INC(total, 10)
|
|
|
+ END;
|
|
|
+
|
|
|
+ (* union / intersection / difference *)
|
|
|
+ c := a + b; (* {1,3,5,65535} *)
|
|
|
+ IF (5 IN c) AND (65535 IN c) THEN INC(total, 10) END;
|
|
|
+ c := a * b; (* {1,3} *)
|
|
|
+ IF (1 IN c) AND (3 IN c) AND NOT (5 IN c) THEN INC(total, 10) END;
|
|
|
+ c := a - b; (* {65535} *)
|
|
|
+ EXCL(c, 65535);
|
|
|
+ IF NOT (65535 IN c) THEN INC(total, 5) END;
|
|
|
+
|
|
|
+ (* signed integer set and bounded wide set *)
|
|
|
+ i := IntSet{-7, 2, 100000};
|
|
|
+ IF (-7 IN i) AND (2 IN i) AND (100000 IN i) AND NOT (-6 IN i) THEN
|
|
|
+ INC(total, 5)
|
|
|
+ END;
|
|
|
+ w := Wide{1, 100000};
|
|
|
+ IF (1 IN w) AND (100000 IN w) AND NOT (99999 IN w) THEN
|
|
|
+ INC(total, 2)
|
|
|
+ END;
|
|
|
+
|
|
|
+ (* ADDRESS/pointer identity *)
|
|
|
+ NEW(p); p^ := 25;
|
|
|
+ addr := ADR(p^);
|
|
|
+ IF addr = p THEN INC(total, 0) END; (* type-check/identity check *)
|
|
|
+
|
|
|
+ SysIO.Write("showcase25 sets=");
|
|
|
+ SysIO.WriteInt(total);
|
|
|
+ SysIO.Write(" addr=");
|
|
|
+ IF addr = p THEN SysIO.Write("ok") ELSE SysIO.Write("bad") END;
|
|
|
+ SysIO.WriteLn;
|
|
|
+
|
|
|
+ IF (total = 42) AND (addr = p) THEN ExitCode := 42 ELSE ExitCode := 1 END
|
|
|
+END Showcase25.
|