| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- MODULE Showcase19;
- // Session showcase: class init body + sibling method calls.
- //
- // The Accumulator class sets a global scale factor in its BEGIN body
- // (run once at startup); its methods call each other by bare name --
- // chains of sibling calls on THIS.
- // Expected ExitCode: 42.
- IMPORT TextIO, Conversions;
- VAR scale : INTEGER; (* set by Accumulator's init body *)
- TYPE
- CLASS Accumulator;
- total : INTEGER;
- PROCEDURE Init(v : INTEGER);
- PROCEDURE Add(v : INTEGER);
- PROCEDURE AddScaled(v : INTEGER); (* sibling: Add *)
- PROCEDURE AddPair(a, b : INTEGER); (* sibling: AddScaled *)
- PROCEDURE Value() : INTEGER;
- END Accumulator;
- CLASS IMPLEMENTATION Accumulator;
- PROCEDURE Init(v : INTEGER);
- BEGIN total := v END Init;
- PROCEDURE Add(v : INTEGER);
- BEGIN total := total + v END Add;
- PROCEDURE AddScaled(v : INTEGER);
- BEGIN Add(v * scale) END AddScaled; (* sibling call on THIS *)
- PROCEDURE AddPair(a, b : INTEGER);
- BEGIN AddScaled(a); AddScaled(b) END AddPair;
- PROCEDURE Value() : INTEGER;
- BEGIN RETURN total END Value;
- BEGIN
- scale := 10 (* class init body *)
- END Accumulator;
- VAR ExitCode : INTEGER;
- VAR acc : Accumulator;
- VAR line, num : ARRAY [0 .. 63] OF CHAR;
- BEGIN
- ExitCode := 0;
- acc.Init(0);
- acc.AddPair(2, 2); (* AddScaled -> Add: +20 +20 = 40 *)
- acc.Add(2); (* +2 = 42 *)
- Conversions.IntToStr(acc.Value(), num);
- line := "showcase19 total=" + num;
- TextIO.WriteString(line);
- TextIO.WriteLn;
- IF acc.Value() = 42 THEN ExitCode := 42 ELSE ExitCode := 1 END
- END Showcase19.
|