fun cat nil r = r | cat (a::l) r = a :: cat l r fun rev nil = nil | rev (a::l) = cat (rev l) (a::nil) fun iterev nil r = r | iterev (a::l) r = iterev l (a::r) fun rev' nil f = f nil | rev' (a::r) f = rev' r (fn l => a :: f l); fun addexp (n: int) (IdExp i) = IdExp i | addexp n (NumExp i) = NumExp (n+i) | addexp n (OpExp (e1,b,e2))= OpExp (addexp n e1, b, addexp n e2) | addexp n (EseqExp(s,e)) = EseqExp (addstm n s, addexp n e) and addstm n (CompoundStm(s1,s2)) = CompoundStm(addstm n s1, addstm n s2) | addstm n (AssignStm(i,e)) = AssignStm(i, addexp n e) | addstm n (PrintStm (el)) = PrintStm (map (addexp n) el) fun addstm n = let fun f (IdExp i) = IdExp i | f(NumExp i) = NumExp (n+i) | f (OpExp (e1,b,e2))= OpExp (f e1, b, f e2) | f (EseqExp(s,e)) = EseqExp (g s, f e) and g (CompoundStm(s1,s2)) = CompoundStm(g s1, g s2) | g (AssignStm(i,e)) = AssignStm(i, f e) | g (PrintStm (el)) = PrintStm (map f el) in g end