blob: 90427d3ad1b2abd9c5ed4f6dca1d7761db01ad63 (
plain)
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
TEMPLATE <T>
CLASS Box
PRIVATE Value : T
PUBLIC OVERLOAD PROCEDURE NEW()
ENDPROCEDURE
PUBLIC OVERLOAD PROCEDURE NEW(V : T)
Value <- V
ENDPROCEDURE
PUBLIC FUNCTION Get() RETURNS T
RETURN Value
ENDFUNCTION
PUBLIC PROCEDURE Set(V : T)
Value <- V
ENDPROCEDURE
ENDCLASS
TEMPLATE <T>
FUNCTION Make() RETURNS T
DECLARE Value : T
RETURN Value
ENDFUNCTION
TEMPLATE <A, B>
CLASS Pair
First : A
Second : B
PROCEDURE NEW(Left : A, Right : B)
First <- Left
Second <- Right
ENDPROCEDURE
ENDCLASS
TEMPLATE <T>
CLASS Stack3
PRIVATE First : T
PRIVATE Second : T
PRIVATE Third : T
PRIVATE Count : INTEGER
PROCEDURE Push(Value : T)
Count <- Count + 1
CASE OF Count
1 : First <- Value
2 : Second <- Value
3 : Third <- Value
ENDCASE
ENDPROCEDURE
FUNCTION Pop() RETURNS T
Count <- Count - 1
CASE OF Count
2 : RETURN Third
1 : RETURN Second
OTHERWISE : RETURN First
ENDCASE
ENDFUNCTION
ENDCLASS
OVERLOAD PROCEDURE PrintAll()
ENDPROCEDURE
TEMPLATE <T, Rest...>
OVERLOAD PROCEDURE PrintAll(First : T, Others : Rest...)
OUTPUT First
CALL PrintAll(Others...)
ENDPROCEDURE
TEMPLATE <Types...>
CLASS Group
PROCEDURE Show(Values : Types...)
CALL PrintAll(Values...)
ENDPROCEDURE
ENDCLASS
TEMPLATE <Types...>
PROCEDURE ShowGroup(Values : Types...)
DECLARE Items : Group<Types...>
CALL Items.Show(Values...)
ENDPROCEDURE
// Instantiation during the type pre-pass defers the Box method prototypes.
TYPE Holder
DECLARE Item : Box<INTEGER>
ENDTYPE
OUTPUT Make<Box<BOOLEAN>>().Get()
DECLARE H : Holder
OUTPUT H.Item.Get()
DECLARE B : Box<INTEGER>(7)
OUTPUT B.Get()
DECLARE P : Pair<INTEGER, REAL>(3, 2.5)
OUTPUT P.First
OUTPUT P.Second
DECLARE S : Stack3<INTEGER>
CALL S.Push(10)
CALL S.Push(20)
CALL S.Push(30)
OUTPUT S.Pop()
OUTPUT S.Pop()
OUTPUT S.Pop()
B <- NEW Box<INTEGER>(5)
OUTPUT B.Get()
DELETE B
DECLARE Inner : Box<INTEGER>(9)
DECLARE Outer : Box<Box<INTEGER>>(Inner)
OUTPUT Outer.Get().Get()
DECLARE Text : Box<STRING>("alpha")
DECLARE Copy : Box<STRING>
Copy <- Text
CALL Text.Set("beta")
OUTPUT Copy.Get()
OUTPUT Text.Get()
DECLARE Values : Group<INTEGER, REAL, CHAR>
CALL Values.Show(1, 2.5, 'c')
CALL ShowGroup()
|