[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] With this treatment, amb is no longer a name with proper scoping. To avoid confusion, we must refrain from declaring amb as a name in our nondeterministic programs.
[3] We didn't worry about undoing declarations, since we assume that a name can't be used prior to the evaluation of its declaration, so its previous value doesn't matter.
4.3.3   Implementing the amb Evaluator