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.