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