signature CalcSig = sig type exp = NUM of real | PLUS of exp * exp | MINUS of exp * exp | MUL of exp * exp | DIV of exp * exp | SQRT of exp | STORE of exp | RESTORE | SEQ of exp list val eval: exp -> real end structure Calc : CalcSig = struct type exp = NUM of real | PLUS of exp * exp | MINUS of exp * exp | MUL of exp * exp | DIV of exp * exp | SQRT of exp | STORE of exp | RESTORE | SEQ of exp list val s = ref 0.0 fun eval (NUM r) = r | eval (PLUS(e1,e2)) = eval e1 + eval e2 | eval (MINUS(e1,e2)) = eval e1 - eval e2 | eval (MUL(e1,e2)) = eval e1 * eval e2 | eval (DIV(e1,e2)) = eval e1 / eval e2 | eval (SQRT e) = sqrt (eval e) | eval (STORE e) = let val v = eval e in s := v; v end | eval (RESTORE) = !s | eval (SEQ []) = 0.0 | eval (SEQ [x]) = eval x | eval (SEQ (x::l)) = eval x; eval (SEQ l) end