Skip to content

Commit fbc2ca2

Browse files
nicolasstuckibiboudis
authored andcommitted
Create enviroment abtractions
1 parent b7b101c commit fbc2ca2

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

tests/run-with-compiler-custom-args/tasty-interpreter/interpreter/TreeInterpreter.scala

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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))

tests/run-with-compiler-custom-args/tasty-interpreter/interpreter/jvm/Interpreter.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ class Interpreter[R <: Reflection & Singleton](reflect0: R) extends TreeInterpre
3535
case IsDefSymbol(symbol) =>
3636
val args1 = if (args == null) Nil else args.toList
3737
val evaluatedArgs = args1.map(arg => LocalValue.valFrom(arg))
38-
39-
val env1 = implicitly[Env] ++ symbol.tree.paramss.headOption.getOrElse(Nil).map(_.symbol).zip(evaluatedArgs)
40-
// println(symbol.tree)
41-
eval(symbol.tree.rhs.get)(env1).asInstanceOf[Object]
38+
val syms = symbol.tree.paramss.headOption.getOrElse(Nil).map(_.symbol)
39+
withLocalValues(syms, evaluatedArgs) {
40+
eval(symbol.tree.rhs.get).asInstanceOf[Object]
41+
}
4242
}
4343
}
4444
else {

0 commit comments

Comments
 (0)