showcase25.mod 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. MODULE Showcase25;
  2. // Showcase of the latest language additions:
  3. // * dynamic SET OF CARDINAL and SET OF INTEGER (sorted range lists),
  4. // * a bounded wide set (SET OF [0..100000]) using the inline form,
  5. // * set union/intersection/difference and INCL/EXCL/IN,
  6. // * ADDRESS/pointer equality (ADR(p^) = p).
  7. // Prints a summary and exits 42.
  8. IMPORT SysIO;
  9. TYPE
  10. CardSet = SET OF CARDINAL;
  11. IntSet = SET OF INTEGER;
  12. Wide = SET OF [0..100000];
  13. VAR
  14. a, b, c : CardSet;
  15. i : IntSet;
  16. w : Wide;
  17. p : POINTER TO INTEGER;
  18. addr : ADDRESS;
  19. total : INTEGER;
  20. ExitCode : INTEGER;
  21. BEGIN
  22. total := 0;
  23. (* dynamic cardinal sets: a = {1,3,65535}, b = {1,3,5} *)
  24. a := CardSet{};
  25. INCL(a, 1); INCL(a, 3); INCL(a, 65535);
  26. b := CardSet{1, 3, 5};
  27. IF (1 IN a) AND (3 IN a) AND (65535 IN a) AND NOT (2 IN a) THEN
  28. INC(total, 10)
  29. END;
  30. (* union / intersection / difference *)
  31. c := a + b; (* {1,3,5,65535} *)
  32. IF (5 IN c) AND (65535 IN c) THEN INC(total, 10) END;
  33. c := a * b; (* {1,3} *)
  34. IF (1 IN c) AND (3 IN c) AND NOT (5 IN c) THEN INC(total, 10) END;
  35. c := a - b; (* {65535} *)
  36. EXCL(c, 65535);
  37. IF NOT (65535 IN c) THEN INC(total, 5) END;
  38. (* signed integer set and bounded wide set *)
  39. i := IntSet{-7, 2, 100000};
  40. IF (-7 IN i) AND (2 IN i) AND (100000 IN i) AND NOT (-6 IN i) THEN
  41. INC(total, 5)
  42. END;
  43. w := Wide{1, 100000};
  44. IF (1 IN w) AND (100000 IN w) AND NOT (99999 IN w) THEN
  45. INC(total, 2)
  46. END;
  47. (* ADDRESS/pointer identity *)
  48. NEW(p); p^ := 25;
  49. addr := ADR(p^);
  50. IF addr = p THEN INC(total, 0) END; (* type-check/identity check *)
  51. SysIO.Write("showcase25 sets=");
  52. SysIO.WriteInt(total);
  53. SysIO.Write(" addr=");
  54. IF addr = p THEN SysIO.Write("ok") ELSE SysIO.Write("bad") END;
  55. SysIO.WriteLn;
  56. IF (total = 42) AND (addr = p) THEN ExitCode := 42 ELSE ExitCode := 1 END
  57. END Showcase25.