@@ -15,6 +15,14 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
1515
1616 type Result = implicit Env => AbstractAny
1717
18+ def localValue (sym : Symbol )(implicit env : Env ): LocalValue = env(sym)
19+
20+ def withLocalValue [T ](sym : Symbol , value : LocalValue )(in : implicit Env => T )(implicit env : Env ): T =
21+ in(env.updated(sym, value))
22+
23+ def withLocalValues [T ](syms : List [Symbol ], values : List [LocalValue ])(in : implicit Env => T )(implicit env : Env ): T =
24+ in(env ++ syms.zip(values))
25+
1826 def interpretCall (fn : Term , argss : List [List [Term ]]): Result = {
1927 val env0 = fn match {
2028 case Term .Select (prefix, _) =>
@@ -25,10 +33,12 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
2533 fn.symbol match {
2634 case IsDefSymbol (sym) =>
2735 val evaluatedArgs = argss.flatten.map(arg => LocalValue .valFrom(eval(arg)))
28- val env1 = env0 ++ sym.tree.paramss.headOption.getOrElse(Nil ).map(_.symbol).zip(evaluatedArgs)
29- eval(sym.tree.rhs.get)(env1)
36+ val syms = sym.tree.paramss.headOption.getOrElse(Nil ).map(_.symbol)
37+ withLocalValues(syms, evaluatedArgs) {
38+ eval(sym.tree.rhs.get)
39+ }
3040 case _ =>
31- env0 (fn.symbol).get
41+ localValue (fn.symbol)(env0 ).get
3242 }
3343 }
3444
@@ -115,7 +125,7 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
115125 }
116126
117127 case Term .Assign (lhs, rhs) =>
118- log(" <interpretAssing>" , tree)(implicitly[ Env ].apply (lhs.symbol).update(eval(rhs)))
128+ log(" <interpretAssing>" , tree)(localValue (lhs.symbol).update(eval(rhs)))
119129
120130 case Term .If (cond, thenp, elsep) => log(" interpretIf" , tree)(interpretIf(cond, thenp, elsep))
121131 case Term .While (cond, body) => log(" interpretWhile" , tree)(interpretWhile(cond, body))
0 commit comments