Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- object Evaluation {
- type Env = Map[String, Value]
- def mtEnv(): Env = Map()
- val num: Value => Double = { case NumValue(num) => num }
- def plus(x: Value, y: Value) = NumValue(num(x) + num(y))
- def mult(x: Value, y: Value) = NumValue(num(x) * num(y))
- def subtract(x: Value, y: Value) = NumValue(num(x) - num(y))
- def divide(x: Value, y: Value) = NumValue(num(x) / num(y))
- def eval(expr: Expr): Value = eval(expr, mtEnv())
- def eval(expr: Expr, env: Env): Value = {
- expr match {
- case Number(d) => NumValue(d)
- case Var(name) => env(name)
- case BinOp("+", left, right) => plus(eval(left, env), eval(right, env))
- case BinOp("*", left, right) => mult(eval(left, env), eval(right, env))
- case BinOp("-", left, right) => subtract(eval(left, env), eval(right, env))
- case BinOp("/", left, right) => { require( eval(right,env) != NumValue(0) )
- divide(eval(left, env), eval(right, env)) }
- case Let(name, expr, body) => {
- eval(body, env + (name -> eval(expr, env)))
- }
- case Fun(param, body) => ClosureValue(param, body, env)
- case App(fun, arg) => {
- val ClosureValue(param, body, env2) = eval(fun, env)
- val eval_args = arg.map((a: Expr) => eval(a, env))
- eval(body, env2 ++ param.zip(eval_args))
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment