forked from lucasspartacus/PUC-Compilers
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test.cl
97 lines (86 loc) · 2.43 KB
/
test.cl
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
(* models one-dimensional cellular automaton on a circle of finite radius
arrays are faked as Strings,
X's respresent live cells, dots represent dead cells,
no error checking is done *)
class CellularAutomaton inherits IO {
population_map : String;
init(map : String) : SELF_TYPE {
{
population_map <- map;
self;
}
};
print() : SELF_TYPE {
{
out_string(population_map.concat("\n"));
self;
}
};
num_cells() : Int {
population_map.length()
};
cell(position : Int) : String {
population_map.substr(position, 1)
};
cell_left_neighbor(position : Int) : String {
if position = 0 then
cell(num_cells() - 1)
else
cell(position - 1)
fi
};
cell_right_neighbor(position : Int) : String {
if position = num_cells() - 1 then
cell(0)
else
cell(position + 1)
fi
};
(* a cell will live if exactly 1 of itself and it's immediate
neighbors are alive *)
cell_at_next_evolution(position : Int) : String {
if (if cell(position) = "X" then 1 else 0 fi
+ if cell_left_neighbor(position) = "X" then 1 else 0 fi
+ if cell_right_neighbor(position) = "X" then 1 else 0 fi
= 1)
then
"X"
else
'.'
fi
};
evolve() : SELF_TYPE {
(let position : Int in
(let num : Int <- num_cells[] in
(let temp : String in
{
while position < num loop
{
temp <- temp.concat(cell_at_next_evolution(position));
position <- position + 1;
}
pool;
population_map <- temp;
self;
}
) ) )
};
};
class Main {
cells : CellularAutomaton;
main() : SELF_TYPE {
{
cells <- (new CellularAutomaton).init(" X ");
cells.print();
(let countdown : Int <- 20 in
while countdown > 0 loop
{
cells.evolve();
cells.print();
countdown <- countdown - 1;
pool
); (* end let countdown
self;
}
};
};