Annotation of researchv10no/cmd/sml/lib/twig/example.mtw, revision 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.