2 // Simple example to garbage collection.
7 #include <AD/gc/markswp.h>
9 MarkSweepGC marksweep_gc;
12 // Define an algebraic datatype.
14 datatype EXP :: collectable = om
23 instantiate datatype EXP;
26 // Define a method that prints an expression. This is simple
27 // inductive definition
29 ostream& operator << (ostream& f, EXP e)
31 om: { return f << "om"; }
32 | num i: { return f << i; }
33 | var v: { return f << v; }
34 | add(a,b): { return f << '(' << a << " + " << b << ')'; }
35 | sub(a,b): { return f << '(' << a << " - " << b << ')'; }
36 | mul(a,b): { return f << '(' << a << " * " << b << ')'; }
37 | div(a,b): { return f << '(' << a << " / " << b << ')'; }
42 // Change all occurance of var(...) to t
44 void change (EXP& e, EXP t)
47 | num i: { e = add(e,add(e,e)); }
49 | add(a,b): { change(a,t); change(b,t); }
50 | sub(a,b): { change(a,t); change(b,t); }
51 | mul(a,b): { change(a,t); change(b,t); }
52 | div(a,b): { change(a,t); change(b,t); }
57 // Do a bunch of stuff that cons a lot
62 // (0 + x * 2) / (1 * 5 + 1 * 3) / (0 / y);
64 EXP t1 = div(div(add(num(0), mul(var('x'),num(2))),
65 add(mul(num(1), num(5)),mul(num(1),num(3)))),
66 div(num(0),var('y')));
68 EXP term = div(mul(t2,t2),t2);
71 cout << "[1] " << term << '\n';
74 cout << "[2] " << term << '\n';
76 term = t1; t1 = num(-1);
77 cout << "[3] " << term << '\n';
80 cout << "[4] " << term << '\n';
85 GC::set_default_gc(marksweep_gc);
87 // start a collection.
88 GC::garbage_collect();