Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Library._
- object Interp {
- def interp(e: ExprC, nv: List[Bind]): Value = e match {
- case NumC(n) => NumV(n)
- case PlusC(l, r) => (interp(l, nv), interp(r, nv)) match {
- case (NumV(n1), NumV(n2)) => NumV(n1 + n2)
- case p => throw InterpException("Bad addition. Expected two numbers, but got: " + p)
- }
- case MultC(l, r) => (interp(l, nv), interp(r, nv)) match {
- case (NumV(n1), NumV(n2)) => NumV(n1 * n2)
- case p => throw InterpException("Bad multiplication. Expected two numbers, but got: " + p)
- }
- case MinusC(l, r) => (interp(l, nv), interp(r, nv)) match {
- case (NumV(n1), NumV(n2)) => NumV(n1 - n2)
- case p => throw InterpException("Bad subtraction. Expected two numbers, but got: " + p)
- }
- case TrueC() => BoolV(true)
- case FalseC() => BoolV(false)
- case EqNumC(l, r) => (interp(l, nv), interp(r, nv)) match {
- case (NumV(n1), NumV(n2)) => BoolV(n1 == n2)
- case p => throw InterpException("Bad number equality. Expected two numbers, but got: " + p)
- }
- case IfC(c, t, e) => interp(c, nv) match {
- case BoolV(b) => b match {
- case true => interp(t, nv)
- case false => interp(e, nv)
- }
- case _ => throw InterpException("If err")
- }
- case AppC(f, arg) => interp(f, nv) match {
- case ClosV(param, body, nv_clos) =>
- val argInterp = interp(arg, nv)
- interp(body, Bind(param, argInterp) :: nv_clos)
- case _ => throw InterpException("AppC err")
- }
- case IdC(x) => nv.find(bd => bd.x == x) match {
- case Some(Bind(_, vl)) => vl
- case _ => {
- println(nv)
- throw InterpException("x not found in nv")
- }
- }
- case FunctionsC(funs, cont) =>
- val closures = funs.map(fun => ClosV(fun.param, fun.body, Nil))
- val funs_clos = funs.zip(closures).map(fun_clos => Bind(fun_clos._1.f, fun_clos._2))
- var largeNv = nv
- funs_clos.foreach(fun_clos => largeNv = fun_clos :: largeNv)
- closures.foreach(clos => clos.nv = largeNv)
- interp(cont, funs_clos ::: nv)
- }
- }
- // import Library._
- //
- // object Interp {
- //
- // // def interpFun(fun: FunC, nv: List[Bind]): ClosV = {
- //
- //
- //
- // // }
- //
- // def interp(e: ExprC, nv: List[Bind]): Value = e match {
- // case NumC(n) => NumV(n)
- // case PlusC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // case (NumV(n1), NumV(n2)) => NumV(n1 + n2)
- // case p => throw InterpException("Bad addition. Expected two numbers, but got: " + p)
- // }
- // case MultC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // case (NumV(n1), NumV(n2)) => NumV(n1 * n2)
- // case p => throw InterpException("Bad multiplication. Expected two numbers, but got: " + p)
- // }
- // case MinusC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // case (NumV(n1), NumV(n2)) => NumV(n1 - n2)
- // case p => throw InterpException("Bad subtraction. Expected two numbers, but got: " + p)
- // }
- // case TrueC() => BoolV(true)
- // case FalseC() => BoolV(false)
- // case EqNumC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // case (NumV(n1), NumV(n2)) => BoolV(n1 == n2)
- // case p => throw InterpException("Bad number equality. Expected two numbers, but got: " + p)
- // }
- // case IfC(c, t, e) => interp(c, nv) match {
- // case BoolV(true) => interp(t, nv)
- // case BoolV(false) => interp(e, nv)
- // case _ => throw InterpException(s"$c does not evaluate to Boolean")
- // }
- // case AppC(f, arg) => interp(f, nv) match {
- // case ClosV(param, body, nv_clos) =>
- // val interpArg = interp(arg, nv)
- // interp(body, Bind(param, interpArg) :: nv_clos)
- //
- // case _ => throw throw InterpException(s"$f does not eval. to ClosV")
- // }
- //
- // case IdC(x) => nv.find(bnd => bnd.x == x) match {
- // case Some(Bind(_, v)) => v
- // case _ => throw throw InterpException(s"$x not present in $nv")
- // }
- // case FunctionsC(funs, cont) =>
- //
- // var newNv = nv
- // val closures = funs.map(fun => ClosV(fun.param, fun.body, Nil))
- //
- // val funs_clos = funs.map(_.f).zip(closures).map(fun_clos => Bind(fun_clos._1, fun_clos._2)) // (fName, Clos)
- //
- // funs_clos.foreach(fun_clos => newNv = fun_clos :: newNv)
- //
- // closures.foreach(clos => clos.nv = newNv)
- //
- // interp(cont, newNv)
- //
- //
- //
- // // var newNv = nv
- // // val closures = funs.map(fun => ClosV(fun.param, fun.body, Nil))
- // // val functionBinds = funs.map(_.f).zip(closures).map(fun_clos => Bind(fun_clos._1, fun_clos._2))
- //
- // // // println(functionBinds)
- // // // functionBinds.foreach(x => print(x.v))
- // // // functionBinds.foreach(x => print(x.v match {
- // // // case ClosV(_, _, nv) => nv
- // // // }))
- //
- // // closures.foreach(clos => clos.nv = functionBinds ::: nv)
- //
- // // interp(cont, functionBinds ::: nv)
- //
- // }
- // }
- //
- // // import Library._
- // //
- // // object Interp {
- // //
- // //
- // // def bindFun(fun: FuncC, curNv: List[Bind]): ClosV = {
- // // val newNv = Bind(fun.f, ClosV(fun.param, fun.body, curNv)) :: curNv
- // // ClosV(fun.f, fun.body, newNv)
- // // }
- // //
- // // def interp(e: ExprC, nv: List[Bind]): Value = e match {
- // // case NumC(n) => NumV(n)
- // // case PlusC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // // case (NumV(n1), NumV(n2)) => NumV(n1 + n2)
- // // case p => throw InterpException("Bad addition. Expected two numbers, but got: " + p)
- // // }
- // //
- // // case MultC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // // case (NumV(n1), NumV(n2)) => NumV(n1 * n2)
- // // case p => throw InterpException("Bad multiplication. Expected two numbers, but got: " + p)
- // // }
- // // case MinusC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // // case (NumV(n1), NumV(n2)) => NumV(n1 - n2)
- // // case p => throw InterpException("Bad subtraction. Expected two numbers, but got: " + p)
- // // }
- // // case TrueC() => BoolV(true)
- // // case FalseC() => BoolV(false)
- // // case EqNumC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // // case (NumV(n1), NumV(n2)) => BoolV(n1 == n2)
- // // case p => throw InterpException("Bad number equality. Expected two numbers, but got: " + p)
- // // }
- // // case IfC(c, t, e) => interp(c, nv) match {
- // // case BoolV(true) => interp(t, nv)
- // // case BoolV(false) => interp(e, nv)
- // // case _ => throw InterpException(s"IF: $c not a Boolean")
- // // }
- // // case AppC(f, arg) => interp(f, nv) match {
- // // case ClosV(x, body, nv_clos) => {
- // // val argInterp = interp(arg, nv)
- // // val newNv = Bind(x, argInterp) :: nv_clos
- // //
- // // interp(body, newNv ::: nv)
- // //
- // // }
- // // case _ =>throw InterpException(s"AppC: $f does evaluate to a function")
- // // }
- // // case IdC(x) => nv.find(bind => bind. x == x) match {
- // // case Some(Bind(_, v)) => v
- // // case None => throw InterpException(s"$x not found in nv")
- // // }
- // // case FunctionsC(funs, cont) =>
- // // var curNv = nv
- // // funs.map(fun => {
- // // val bindsFun: ClosV = bindFun(fun, curNv)
- // // curNv = bindsFun.nv
- // //
- // // })
- // //
- // // interp(cont, curNv)
- // // }
- // // }
- // //
- // // // import Library._
- // // //
- // // // object Interp {
- // // //
- // // // def lookup(x: String, nv: List[Bind]): Value = nv match {
- // // // case bind :: t => if (bind.x == x) bind.v else lookup(x, t)
- // // // case _ => throw InterpException(s"$x not found in nv_lookup")
- // // // }
- // // //
- // // // def bindFunction(fun: FuncC, nv: List[Bind]): ClosV = {
- // // //
- // // // val bind = Bind(fun.f, ClosV(fun.param, fun.body, nv))
- // // // var newEnv = bind :: nv
- // // // ClosV(fun.f, fun.body, newEnv)
- // // // }
- // // //
- // // // def interp(e: ExprC, nv: List[Bind]): Value = e match {
- // // // case NumC(n) => NumV(n)
- // // // case PlusC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // // // case (NumV(n1), NumV(n2)) => NumV(n1 + n2)
- // // // case p => throw InterpException("Bad addition. Expected two numbers, but got: " + p)
- // // // }
- // // // case MultC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // // // case (NumV(n1), NumV(n2)) => NumV(n1 * n2)
- // // // case p => throw InterpException("Bad multiplication. Expected two numbers, but got: " + p)
- // // // }
- // // // case MinusC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // // // case (NumV(n1), NumV(n2)) => NumV(n1 - n2)
- // // // case p => throw InterpException("Bad subtraction. Expected two numbers, but got: " + p)
- // // // }
- // // // case TrueC() => BoolV(true)
- // // // case FalseC() => BoolV(false)
- // // // case EqNumC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // // // case (NumV(n1), NumV(n2)) => BoolV(n1 == n2)
- // // // case p => throw InterpException("Bad number equality. Expected two numbers, but got: " + p)
- // // // }
- // // // case IfC(c, t, e) => interp(c, nv) match {
- // // // case BoolV(b) => if (b) interp(t, nv) else interp(e, nv)
- // // // case _ => throw InterpException(s"$c not Bool")
- // // // }
- // //
- // // //
- // // // case AppC(f, arg) => interp(f, nv) match {
- // // // case ClosV(x, e, nv_clos) =>
- // // //
- // // // val interpArg = interp(arg, nv)
- // // // val binds = Bind(x, interpArg) :: nv_clos
- // // // interp(e, binds ::: nv)
- // // // // val params_nv = Bind(x, interp(e, nv_clos)) :: nv_clos
- // // // // val interpArg = interp(arg, nv)
- // // // // interp(e, )
- // // // case _ => throw InterpException(s"$f is not a ClosV")
- // // //
- // // // }
- // // // case IdC(x) => lookup(x, nv)
- // // // case FunctionsC(funs, cont) =>
- // // // var nvGl: List[Bind] = nv
- // // // funs.map(fun => {
- // // // val closv: ClosV = bindFunction(fun, nvGl)
- // // // nvGl = closv.nv
- // // // }
- // // // )
- // // //
- // // // interp(cont, nvGl)
- // // // }
- // // // }
- // // //
- // // // // import Library._
- // // // //
- // // // // object Interp {
- // // // //
- // // // // def lookup(x: String, nv: List[Bind]): Value = nv match {
- // // // // case Bind(name, value) :: t => if (name == x) value else lookup(x, t)
- // // // // case Nil => throw InterpException(s"$x was not found in env. $nv")
- // // // // }
- // // // //
- // // // // def bindFunction(fun: FuncC, nv: List[Bind]): ClosV = {
- // // // // val closBind = Bind(fun.f, ClosV(fun.param, fun.body, nv))
- // // // // var newEnv = closBind :: nv
- // // // //
- // // // // newEnv(0).v match {
- // // // // case ClosV(_, _, nvOld) => ClosV(_, _, newEnv)
- // // // // case _ => throw new InterpException("")
- // // // // }
- // // // //
- // // // // ClosV(fun.f, fun.body, newEnv)
- // // // // }
- // // // //
- // // // //
- // // // // def interp(e: ExprC, nv: List[Bind]): Value = e match {
- // // // // case NumC(n) => NumV(n)
- // // // // case PlusC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // // // // case (NumV(n1), NumV(n2)) => NumV(n1 + n2)
- // // // // case p => throw InterpException("Bad addition. Expected two numbers, but got: " + p)
- // // // // }
- // // // // case MultC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // // // // case (NumV(n1), NumV(n2)) => NumV(n1 * n2)
- // // // // case p => throw InterpException("Bad multiplication. Expected two numbers, but got: " + p)
- // // // // }
- // // // // case MinusC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // // // // case (NumV(n1), NumV(n2)) => NumV(n1 - n2)
- // // // // case p => throw InterpException("Bad subtraction. Expected two numbers, but got: " + p)
- // // // // }
- // // // // case TrueC() => BoolV(true)
- // // // // case FalseC() => BoolV(false)
- // // // // case EqNumC(l, r) => (interp(l, nv), interp(r, nv)) match {
- // // // // case (NumV(n1), NumV(n2)) => BoolV(n1 == n2)
- // // // // case p => throw InterpException("Bad number equality. Expected two numbers, but got: " + p)
- // // // // }
- // // // // case IfC(c, t, e) => interp(c, nv) match {
- // // // // case BoolV(b) => if (b) interp(t, nv) else interp(e, nv)
- // // // // case _ => throw new InterpException("Should not reach this")
- // // // // }
- // // // // case AppC(f, arg) => interp(f, nv) match {
- // // // // case ClosV(x, body, nv_clos) =>
- // // // // val argInterp = interp(arg, nv)
- // // // // val newNv = Bind(x, argInterp) :: nv_clos ::: nv
- // // // // interp(body, newNv)
- // // // //
- // // // //
- // // // // case _ => throw new InterpException(s"$f is not a Closure")
- // // // // }
- // // // // case IdC(x) => lookup(x, nv)
- // // // //
- // // // // case FunctionsC(funs, cont) => {
- // // // // var lastNv = nv;
- // // // // val ans = funs.map(fun => {
- // // // // val closv: ClosV = bindFunction(fun, lastNv)
- // // // // lastNv = closv.nv
- // // // // })
- // // // //
- // // // // interp(cont, lastNv)
- // // // // }
- // // // //
- // // // // }
- // // // // }
- // // // //
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement