@@ -15,6 +15,14 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
15
15
16
16
type Result = implicit Env => AbstractAny
17
17
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
+
18
26
def interpretCall (fn : Term , argss : List [List [Term ]]): Result = {
19
27
val env0 = fn match {
20
28
case Term .Select (prefix, _) =>
@@ -25,10 +33,12 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
25
33
fn.symbol match {
26
34
case IsDefSymbol (sym) =>
27
35
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
+ }
30
40
case _ =>
31
- env0 (fn.symbol).get
41
+ localValue (fn.symbol)(env0 ).get
32
42
}
33
43
}
34
44
@@ -115,7 +125,7 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
115
125
}
116
126
117
127
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)))
119
129
120
130
case Term .If (cond, thenp, elsep) => log(" interpretIf" , tree)(interpretIf(cond, thenp, elsep))
121
131
case Term .While (cond, body) => log(" interpretWhile" , tree)(interpretWhile(cond, body))
0 commit comments