with debug info
[prop.git] / tests / hashcons.pcc
blobaa10b485961491d2ea549ca9d461e388a976dc9e
1 //
2 //  This is a simple (and useless) example for testing the hash cons feature
3 //  in Prop.
4 //
5 #include <iostream.h>
7 datatype EXP :: unique = num (int)
8                        | add (EXP, EXP)
9                        | sub (EXP, EXP)
10                        | mul (EXP, EXP)
11                        | div (EXP, EXP)
12 and LIST :: unique     = nil
13                        | list (EXP, LIST)
14                        ;
17 //  implement the datatypes.
19 instantiate datatype EXP, LIST; 
21 ostream& operator << (ostream& f, EXP e)
23    match (e) {
24       num n:    { return f << n; }
25    |  add(x,y): { return f << '(' << x << " + " << y << ')'; }
26    |  sub(x,y): { return f << '(' << x << " - " << y << ')'; }
27    |  mul(x,y): { return f << '(' << x << " * " << y << ')'; }
28    |  div(x,y): { return f << '(' << x << " / " << y << ')'; }
29    }
32 ostream& operator << (ostream& f, LIST l)
34    match (l) {
35       case nil:           return f;
36       case list(e,nil):   return f << e;
37       case list(e,t):     return f << e << ',' << t;
38    }
41 int main()
43    EXP e1 = mul(add(num(1),num(2)), add(num(2), num(3)));
44    EXP e2 = mul(add(num(1),num(2)), add(num(2), num(3)));
45    LIST l1 = list(e1, list(e2, nil));
46    cout << l1 << '\n';
47    cout << ((e1 == e2) ? "Good!\n" : "Bad boy! Naughty, naughty boy!\n");
48    cout << ((num(1) == num(1)) ? "Good!\n" : "Bad boy! Naughty, naughty boy!\n");
49    cout << ((num(1) != num(2)) ? "Good!\n" : "Bad boy! Naughty, naughty boy!\n");
50    cout << ((add(e1,e2) == add(e1,e2)) ? "Good!\n" : "Bad boy! Naughty, naughty boy!\n");
51    cout << ((add(e1,e2) != add(e1,num(2))) ? "Good!\n" : "Bad boy! Naughty, naughty boy!\n");
52    return 0;