3.2 Solution for Exercise 7

When implementing a macro’s dynamic behavior with a function, an expression becomes a function; an expression to be evaluated in an extended environment becomes a function with arguments.

In andlet1, e2 is evaluated in the scope of the variable x. So the function for e2 has a single formal parameter: x.

(define-syntax-rule (andlet1 x e1 e2)
  (andlet1-fun (lambda () e1) (lambda (x) e2)))
(define (andlet1-fun thunk1 fun2)
  (let ([tmp (thunk1)])
    (if tmp
        (fun2 tmp)

Of course, this technique breaks down if the variable’s scope includes multiple expressions handled separately by the macro and if the expressions use set! to mutate the variable.