+(define (ast-collect f x)
+ (define (inner y) (ast-collect f y))
+ (case (ast-type x)
+ ['let (append (f x)
+ (fold-map inner (let-bindings x))
+ (fold-map inner (let-body x)))]
+ ['app (append (f x)
+ (fold-map inner x))]
+ ['lambda (append (f x)
+ (inner (lambda-body x)))]
+ ['if (append (f x)
+ (fold-map inner (cdr x)))]
+ [else (f x)]))
+