Annotation of researchv10no/cmd/sml/lib/twig/example.mtw, revision 1.1.1.1

1.1       root        1:    (* Example of a complete ML-Twig specification:        *)
                      2:    (* Evaluation of expressions                           *)
                      3: 
                      4:    node   Plus(2), Minus(2), Mul(2);
                      5:    node   Const(0);
                      6: 
                      7:    prologue (
                      8:    
                      9:    (* The type and function definitions                   *)
                     10: 
                     11:       datatype tree = Tree of (tree * symbol * tree) | Leaf of int
                     12:       type cost = int
                     13: 
                     14:       fun get_subtrees(Leaf _) = []
                     15:         | get_subtrees(Tree (t1,_,t2)) = [t1,t2]
                     16:       fun node_value(Tree(_,ope,_))  = ope
                     17:         | node_value (Leaf _) = Const
                     18:       val cost_less : int * int -> bool = (op <)
                     19: 
                     20:       fun constValue (Leaf i) = i
                     21:       datatype instr = PUSH of int | PLUS | MINUS | MUL | PLUSMUL
                     22:    );
                     23: 
                     24:    label Expr of instr list;
                     25:    
                     26:    default_cost( fn subexprcost => fold (op +) subexprcost 0);
                     27: 
                     28:    (* Rules                                               *)
                     29: 
                     30:    Expr Const            =([PUSH (constValue $$)]);
                     31:    
                     32:    Expr Plus(Expr,Expr) :   (2+Expr1+Expr2) =(Expr1@Expr2@[PLUS]);
                     33:    
                     34:    Expr Minus(Expr,Expr) :  (2+Expr1+Expr2) =(Expr1@Expr2@[MINUS]);
                     35:    
                     36:    Expr Mul(Expr,Expr) :    (2+DC)          =(Expr1@Expr2@[MUL]);
                     37: 
                     38:    Expr Mul(Expr,Plus(Expr,Expr)) : (3+DC)  =(Expr1@Expr2@Expr3@[PLUSMUL]);
                     39: 
                     40:    REWRITE Expr Mul(Plus(Expr,Expr),Expr) : (0)  =(Tree($2$,Mul,$1$));
                     41:    
                     42:    (* End                                                 *)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.