structure Machine = struct datatype Action = PushLit of int | PushVal of string | Mul | Add fun execute env code = let exception Eval fun v s = Environment.lookup env s fun run(args, PushLit n :: ops) = run( n :: args, ops) | run(args, PushVal e :: ops) = run(v e :: args, ops) | run(a::b::args, Mul :: ops) = run(a*b :: args, ops) | run(a::b::args, Add :: ops) = run(a+b :: args, ops) | run([result], []) = result | run _ = raise Eval in run([], code) end end