1: #line 1454 "./lpsrc/flx_regress.pak"
2:
3:
4:
5: union tree = TEmpty | Leaf of int | Node of tree * tree;
6:
7: var example =
8: Node
9: (
10: Node
11: (
12: Leaf 1,
13: Node
14: (
15: Leaf 2,
16: Leaf 3
17: )
18: )
19: ,
20: Node
21: (
22: Leaf 4,
23: Leaf 5
24: )
25: )
26: ;
27:
28: fun sum: tree->int =
29: | Leaf ?x => x
30: | Node (?l,?r) => sum l + sum r
31: | TEmpty => 0
32: ;
33:
34: print$ sum example; endl;
35:
36: fun accumulate(it: 1-> int):int=
37: {
38: var x = 0;
39: var v = it();
40: whilst v != -1 do
41: x += v;
42: v = it();
43: done;
44: return x;
45: }
46:
47: gen visitor(x:tree) () : int =
48: {
49: var con =
50: match x with
51: | Leaf ?a => { print "visiting leaf "; print a; endl; yield a; return -1; }
52: | Node (?a,?b) =>
53: {
54: print "visiting node: left\n";
55: var it = visitor(a);
56: var v = it();
57: whilst v != -1 do
58: yield v;
59: v = it();
60: done;
61: print "visiting node: right\n";
62: it = visitor(b);
63: v = it();
64: whilst v != -1 do
65: yield v;
66: v = it();
67: done;
68: return -1;
69: }
70: | TEmpty => { return -1; }
71: endmatch
72: ;
73: var r = con();
74: whilst r != -1 do
75: yield r;
76: r = con();
77: done;
78: return -1;
79: }
80:
81: var it = visitor(example);
82: var res = accumulate(it);
83: print$ res; endl;
1: 15
2: visiting node: left
3: visiting node: left
4: visiting leaf 1
5: visiting node: right
6: visiting node: left
7: visiting leaf 2
8: visiting node: right
9: visiting leaf 3
10: visiting node: right
11: visiting node: left
12: visiting leaf 4
13: visiting node: right
14: visiting leaf 5
15: 15