| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- 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.
|