showcase19.mod 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. MODULE Showcase19;
  2. // Session showcase: class init body + sibling method calls.
  3. //
  4. // The Accumulator class sets a global scale factor in its BEGIN body
  5. // (run once at startup); its methods call each other by bare name --
  6. // chains of sibling calls on THIS.
  7. // Expected ExitCode: 42.
  8. IMPORT TextIO, Conversions;
  9. VAR scale : INTEGER; (* set by Accumulator's init body *)
  10. TYPE
  11. CLASS Accumulator;
  12. total : INTEGER;
  13. PROCEDURE Init(v : INTEGER);
  14. PROCEDURE Add(v : INTEGER);
  15. PROCEDURE AddScaled(v : INTEGER); (* sibling: Add *)
  16. PROCEDURE AddPair(a, b : INTEGER); (* sibling: AddScaled *)
  17. PROCEDURE Value() : INTEGER;
  18. END Accumulator;
  19. CLASS IMPLEMENTATION Accumulator;
  20. PROCEDURE Init(v : INTEGER);
  21. BEGIN total := v END Init;
  22. PROCEDURE Add(v : INTEGER);
  23. BEGIN total := total + v END Add;
  24. PROCEDURE AddScaled(v : INTEGER);
  25. BEGIN Add(v * scale) END AddScaled; (* sibling call on THIS *)
  26. PROCEDURE AddPair(a, b : INTEGER);
  27. BEGIN AddScaled(a); AddScaled(b) END AddPair;
  28. PROCEDURE Value() : INTEGER;
  29. BEGIN RETURN total END Value;
  30. BEGIN
  31. scale := 10 (* class init body *)
  32. END Accumulator;
  33. VAR ExitCode : INTEGER;
  34. VAR acc : Accumulator;
  35. VAR line, num : ARRAY [0 .. 63] OF CHAR;
  36. BEGIN
  37. ExitCode := 0;
  38. acc.Init(0);
  39. acc.AddPair(2, 2); (* AddScaled -> Add: +20 +20 = 40 *)
  40. acc.Add(2); (* +2 = 42 *)
  41. Conversions.IntToStr(acc.Value(), num);
  42. line := "showcase19 total=" + num;
  43. TextIO.WriteString(line);
  44. TextIO.WriteLn;
  45. IF acc.Value() = 42 THEN ExitCode := 42 ELSE ExitCode := 1 END
  46. END Showcase19.