1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
CLASS Counter
PRIVATE Value : INTEGER
PROCEDURE Set(Number : INTEGER)
Value <- Number
ENDPROCEDURE
FUNCTION Get() RETURNS INTEGER
RETURN Value
ENDFUNCTION
PROCEDURE Add(Number : INTEGER)
this.Set(this.Get() + Number)
ENDPROCEDURE
PROCEDURE Copy(Other : Counter)
this <- Other
ENDPROCEDURE
FUNCTION Clone() RETURNS Counter
RETURN this
ENDFUNCTION
FUNCTION ReadOther(Other : Counter) RETURNS INTEGER
RETURN Other.Hidden()
ENDFUNCTION
PRIVATE FUNCTION Hidden() RETURNS INTEGER
RETURN Value
ENDFUNCTION
FUNCTION Sum(Number : INTEGER) RETURNS INTEGER
IF Number = 0 THEN
RETURN 0
ENDIF
RETURN Number + this.Sum(Number - 1)
ENDFUNCTION
PROCEDURE Take(BYREF Number : INTEGER, BYREF Values : ARRAY OF INTEGER)
Number <- Number + Value
Values[1] <- Number
ENDPROCEDURE
PROCEDURE Fail()
THROW
ENDPROCEDURE
PROCEDURE PassSelf()
CALL Change(this)
ENDPROCEDURE
ENDCLASS
CLASS Marker
FUNCTION Get() RETURNS INTEGER
RETURN 99
ENDFUNCTION
ENDCLASS
TYPE Container
DECLARE Item : Counter
ENDTYPE
TYPE CounterPointer = ^Counter
PROCEDURE Change(BYREF Target : Counter)
Target.Set(42)
ENDPROCEDURE
FUNCTION Get() RETURNS INTEGER
RETURN 100
ENDFUNCTION
DECLARE A : Counter
DECLARE B : Counter
CALL a.sET(3)
B.Set(8)
A.Add(2)
OUTPUT A.Get(), ",", B.Get()
CALL A.Copy(B)
A.Set(9)
OUTPUT A.Get(), ",", B.Get()
B <- A.Clone()
OUTPUT B.Get(), ",", A.ReadOther(B)
OUTPUT A.Sum(4), ",", Get()
DECLARE Items : ARRAY[1:2] OF Counter
Items[1].Set(6)
DECLARE Wrapped : Container
Wrapped.Item.Set(7)
DECLARE P : CounterPointer
P <- ^Items[1]
P^.Add(4)
OUTPUT Items[1].Get(), ",", Wrapped.Item.Get()
DECLARE Number : INTEGER
DECLARE Values : ARRAY[1:2] OF INTEGER
Number <- 1
CALL A.Take(Number, Values)
OUTPUT Number, ",", Values[1]
TRY
A.Fail()
CATCH
OUTPUT "caught"
ENDTRY
A.PassSelf()
OUTPUT A.Get()
DECLARE M : Marker
OUTPUT M.Get()
|