Merge remote branch 'master'
[prop.git] / tests / test_gc2.pcc
blob8c7835702e7be33c7b00da97d0d24fa8dbd4cf6d
1 //
2 //  Simple example to garbage collection.
3 //
5 #include <new>
6 #include <iostream.h>
8 //
9 //  Define an algebraic datatype.
11 datatype EXP :: collectable = om
12                             | num (int)
13                             | var (char)
14                             | add (EXP, EXP)
15                             | sub (EXP, EXP)
16                             | mul (EXP, EXP)
17                             | div (EXP, EXP)
18                             ;
20 instantiate datatype EXP;
23 //  Define a method that prints an expression.  This is simple
24 //  inductive definition
26 ostream& operator << (ostream& f, EXP e)
27 {  match (e) {
28       om:       { return f << "om"; }
29    |  num i:    { return f << i; }
30    |  var v:    { return f << v; }
31    |  add(a,b): { return f << '(' << a << " + " << b << ')'; }
32    |  sub(a,b): { return f << '(' << a << " - " << b << ')'; }
33    |  mul(a,b): { return f << '(' << a << " * " << b << ')'; }
34    |  div(a,b): { return f << '(' << a << " / " << b << ')'; }
35    }
39 //  Change all occurance of var(...) to t
41 void change (EXP& e, EXP t)
42 {  match (e) {
43       om:       
44    |  num i:    { e = add(e,add(e,e)); }
45    |  var v:    { e = t; }
46    |  add(a,b): { change(a,t); change(b,t); }
47    |  sub(a,b): { change(a,t); change(b,t); }
48    |  mul(a,b): { change(a,t); change(b,t); }
49    |  div(a,b): { change(a,t); change(b,t); }
50    }
54 //  Do a bunch of stuff that cons a lot
56 void do_something()
58    //
59    // (0 + x * 2) / (1 * 5 + 1 * 3) / (0 / y);
60    //
61    EXP t1   = div(div(add(num(0), mul(var('x'),num(2))), 
62                       add(mul(num(1), num(5)),mul(num(1),num(3)))),
63                   div(num(0),var('y')));
64    EXP t2   = add(t1,t1);
65    EXP term = div(mul(t2,t2),t2);
66    t2       = om;
68    cout << "[1] " << term << '\n';
70    change(term,num(-2));
71    cout << "[2] " << term << '\n';
73    term = t1; t1 = num(-1);
74    cout << "[3] " << term << '\n';
76    term = om; t1 = om;
77    cout << "[4] " << term << '\n';
79   
80 int main()
82    do_something();
83    // start a collection.
84    GC::garbage_collect();
85    return 0;