MODULE Showcase2; (* Step-9 tour: exported TYPEs, module whole-copy both directions, enum literals, field/row copy, VAR tails, open arrays, I/O. *) MODULE M EXPORT Point, Color, Red, Green, Blue, Vec, G, N, Reset; TYPE Point = RECORD x, y : INTEGER END; TYPE Color = (Red, Green, Blue); TYPE Vec = ARRAY [1 .. 3] OF INTEGER; VAR G : Point; VAR N : INTEGER; PROCEDURE Reset; BEGIN G.x := 0; G.y := 0; N := 0 END Reset; END M; TYPE Inner = RECORD u, v : INTEGER END; TYPE Outer = RECORD a : INTEGER; b : Inner END; VAR p, q : M.Point; VAR c : M.Color; VAR v : M.Vec; VAR m, n : ARRAY [1 .. 2], [1 .. 2] OF INTEGER; VAR r1, r2 : Outer; VAR total : INTEGER; VAR ExitCode : INTEGER; PROCEDURE Bump(VAR x : INTEGER); BEGIN x := x + 1 END Bump; PROCEDURE SumOpen(x : ARRAY OF INTEGER) : INTEGER; VAR i, s : INTEGER; BEGIN s := 0; FOR i := 0 TO HIGH(x) DO s := s + x[i] END; RETURN s END SumOpen; BEGIN total := 0; WriteString("show2"); M.Reset(); M.N := 7; total := total + M.N; p.x := 3; p.y := 4; M.G := p; total := total + M.G.x + M.G.y; q := M.G; total := total + q.x * q.y; c := M.Blue; CASE c OF M.Red : total := total + 0 | M.Green : total := total + 0 | M.Blue : total := total + 6 END; IF c # M.Red THEN total := total + 1 END; m[1,1] := 1; m[1,2] := 2; m[2,1] := 3; m[2,2] := 4; n[2] := m[1]; total := total + n[2,1] + n[2,2]; r1.a := 0; r1.b.u := 10; r1.b.v := 20; r2.b := r1.b; total := total + r2.b.u + r2.b.v; Bump(q.y); total := total + q.y; v[1] := 2; v[2] := 4; v[3] := 6; total := total + SumOpen(v); WriteInt(total); ExitCode := total END Showcase2.