@@ -13,12 +13,14 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
13
13
/** Representation of objects and values in the interpreter */
14
14
type AbstractAny
15
15
16
- def interpretCall (fn : Term , argss : List [List [Term ]])(implicit env : Env ): AbstractAny = {
16
+ type Result = implicit Env => AbstractAny
17
+
18
+ def interpretCall (fn : Term , argss : List [List [Term ]]): Result = {
17
19
val env0 = fn match {
18
20
case Term .Select (prefix, _) =>
19
21
val pre = eval(prefix)
20
- env // FIXME add pre to the env as `this`
21
- case _ => env
22
+ implicitly[ Env ] // FIXME add pre to the env as `this`
23
+ case _ => implicitly[ Env ]
22
24
}
23
25
fn.symbol match {
24
26
case IsDefSymbol (sym) =>
@@ -30,19 +32,19 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
30
32
}
31
33
}
32
34
33
- def interpretNew (fn : Tree , argss : List [List [Term ]])( implicit env : Env ) : AbstractAny
35
+ def interpretNew (fn : Tree , argss : List [List [Term ]]): Result
34
36
35
- def interpretIf (cond : Term , thenp : Term , elsep : Term )( implicit env : Env ) : AbstractAny =
37
+ def interpretIf (cond : Term , thenp : Term , elsep : Term ): Result =
36
38
if (eval(cond).asInstanceOf [Boolean ]) eval(thenp)
37
39
else eval(elsep)
38
40
39
- def interpretWhile (cond : Term , body : Term )( implicit env : Env ) : AbstractAny = {
41
+ def interpretWhile (cond : Term , body : Term ): Result = {
40
42
while (eval(cond).asInstanceOf [Boolean ]) eval(body)
41
43
interpretUnit()
42
44
}
43
45
44
- def interpretBlock (stats : List [Statement ], expr : Term )( implicit env : Env ) : AbstractAny = {
45
- val newEnv = stats.foldLeft(env )((accEnv, stat) => stat match {
46
+ def interpretBlock (stats : List [Statement ], expr : Term ): Result = {
47
+ val newEnv = stats.foldLeft(implicitly[ Env ] )((accEnv, stat) => stat match {
46
48
case ValDef (name, tpt, Some (rhs)) =>
47
49
def evalRhs = eval(rhs)(accEnv)
48
50
val evalRef : LocalValue =
@@ -62,10 +64,10 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
62
64
}
63
65
64
66
def interpretUnit (): AbstractAny
65
- def interpretLiteral (const : Constant )( implicit env : Env ) : AbstractAny
67
+ def interpretLiteral (const : Constant ): Result
66
68
67
- def interpretIsInstanceOf (o : AbstractAny , tpt : TypeTree )( implicit env : Env ) : AbstractAny
68
- def interpretAsInstanceOf (o : AbstractAny , tpt : TypeTree )( implicit env : Env ) : AbstractAny
69
+ def interpretIsInstanceOf (o : AbstractAny , tpt : TypeTree ): Result
70
+ def interpretAsInstanceOf (o : AbstractAny , tpt : TypeTree ): Result
69
71
70
72
def interpretEqEq (x : AbstractAny , y : AbstractAny ): AbstractAny
71
73
@@ -80,7 +82,7 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
80
82
def interpretPrivitiveQuot (x : AbstractAny , y : AbstractAny ): AbstractAny
81
83
def interpretPrivitiveRem (x : AbstractAny , y : AbstractAny ): AbstractAny
82
84
83
- def eval (tree : Statement )( implicit env : Env ) : AbstractAny = {
85
+ def eval (tree : Statement ): Result = {
84
86
tree match {
85
87
case Call (fn, targs, argss) =>
86
88
fn match {
@@ -113,7 +115,7 @@ abstract class TreeInterpreter[R <: Reflection & Singleton](val reflect: R) {
113
115
}
114
116
115
117
case Term .Assign (lhs, rhs) =>
116
- log(" <interpretAssing>" , tree)(env (lhs.symbol).update(eval(rhs)))
118
+ log(" <interpretAssing>" , tree)(implicitly[ Env ].apply (lhs.symbol).update(eval(rhs)))
117
119
118
120
case Term .If (cond, thenp, elsep) => log(" interpretIf" , tree)(interpretIf(cond, thenp, elsep))
119
121
case Term .While (cond, body) => log(" interpretWhile" , tree)(interpretWhile(cond, body))
0 commit comments