```
  def evalApply(expr: Tree, args: List[Tree])(implicit env: Env): Result = {
    val Result(vexpr, env1) = eval(expr)
    val Results(vargs, env2) = eval(args)(env1)
    vexpr.apply(vargs, env2)
  }
```
The simplification will come for other parts that do not change the env and will just implicitly thread the env without manual argument passing all over the place.