+(define (ast-traverse f x)
+ (case (ast-type x)
+ ('let `(let ,(map (lambda (x) (list (car x) (f (cadr x))))
+ (let-bindings x))
+ ,@(map f (let-body x))))
+ ('app (map f x))
+ ('lambda `(lambda ,(lambda-args x) ,(f (lambda-body x))))
+ ('if `(if ,@(map f (cdr x))))
+ (else x)))