[1] We chose to implement the lazy evaluator in section 4.2 as a modification of the ordinary metacircular evaluator of section 4.1.1. In contrast, we will base the amb evaluator on the analyzing evaluator of section 4.1.7, because the execution functions in that evaluator provide a convenient framework for implementing backtracking.
[2] We assume that the evaluator supports let (see exercise ), which we have used in our nondeterministic programs.
[3] We didn't worry about undoing declarations, since we can assume that internal declarations are scanned out (section 4.1.6).
4.3.3 Implementing the amb Evaluator