Guest User

Untitled

a guest
Jan 4th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.35 KB | None | 0 0
  1. object Evaluation {
  2. type Env = Map[String, Value]
  3. def mtEnv(): Env = Map()
  4. val num: Value => Double = { case NumValue(num) => num }
  5. def plus(x: Value, y: Value) = NumValue(num(x) + num(y))
  6. def mult(x: Value, y: Value) = NumValue(num(x) * num(y))
  7. def subtract(x: Value, y: Value) = NumValue(num(x) - num(y))
  8. def divide(x: Value, y: Value) = NumValue(num(x) / num(y))
  9. def eval(expr: Expr): Value = eval(expr, mtEnv())
  10. def eval(expr: Expr, env: Env): Value = {
  11. expr match {
  12. case Number(d) => NumValue(d)
  13. case Var(name) => env(name)
  14. case BinOp("+", left, right) => plus(eval(left, env), eval(right, env))
  15. case BinOp("*", left, right) => mult(eval(left, env), eval(right, env))
  16. case BinOp("-", left, right) => subtract(eval(left, env), eval(right, env))
  17. case BinOp("/", left, right) => { require( eval(right,env) != NumValue(0) )
  18. divide(eval(left, env), eval(right, env)) }
  19. case Let(name, expr, body) => {
  20. eval(body, env + (name -> eval(expr, env)))
  21. }
  22. case Fun(param, body) => ClosureValue(param, body, env)
  23. case App(fun, arg) => {
  24. val ClosureValue(param, body, env2) = eval(fun, env)
  25.  
  26. val eval_args = arg.map((a: Expr) => eval(a, env))
  27. eval(body, env2 ++ param.zip(eval_args))
  28. }
  29. }
  30. }
  31. }
Add Comment
Please, Sign In to add comment