(define reduce-once-appl (lambda (exp succeed fail) (variant-case exp (lit (datum) (fail)) (varref (var) (fail)) (lambda (formal body) (fail)) (app (rator rand) (reduce-once-appl rator (lambda (reduced-rator) (succeed (make-app reduced-rator rand))) (lambda () (reduce-once-appl rand (lambda (reduced-rand) (succeed (make-app rator reduced-rand))) (lambda () (if (beta-redex? exp) (succeed (beta-reduce exp)) (fail))))))) (else (error "unknown AST type" exp)))))