initial
[prop.git] / demos / rewrite-trick1.pC
blob14796dc5cf6f222516aba762edd93c3af985e34d
1 #include <iostream.h>
2 #include <AD/generic/generic.h>
4 class Rewritable 
5 {  Bool enabled;
6 public:
7    Rewritable() : enabled(true) {}
8    void enable() { enabled = true; }
9    void disable() { enabled = false; }
10    Bool is_enabled() { return enabled; } 
13 datatype Exp : public Rewritable :: rewrite = 
14    NUM of int      => _  
15 |  ADD of Exp, Exp => "(" _ "+" _ ")"
16    public:
17    {  friend Exp FINAL(Exp e) { e->disable(); return e; }
18    }
21 instantiate datatype Exp;
23 rewrite class Silly (Exp) {
24 public:
25    Silly() {}
28 rewrite Silly {
29    NUM 0 | redex->is_enabled():  FINAL(NUM(1))
30 |  NUM x | redex->is_enabled():  FINAL(NUM(2))
33 int main() 
35    Exp e = ADD(NUM(0),NUM(3));
36    Silly S;
37    cout << "Before = " << e << '\n';
38    S(e);
39    rewrite (e) type (Exp) { (e : Exp): { e->enable(); } }
40    cout << "After = " << e << '\n';
41    return 0;