18 ('closure 'closure) ; only available in codegen
19 ('static-string 'static-string) ; only available in codegen
21 ((builtin? x) 'builtin)
23 ((integer? x) 'int-literal)
24 ((boolean? x) 'bool-literal)
25 ((string? x) 'string-literal)))
27 (define (ast-traverse f x)
29 ('let `(let ,(map (lambda (x) (list (car x) (f (cadr x))))
31 ,@(map f (let-body x))))
33 ('lambda `(lambda ,(lambda-args x) ,(f (lambda-body x))))
34 ('if `(if ,@(map f (cdr x))))
37 (define (ast-collect f x)
38 (define (inner y) (ast-collect f y))
41 (fold-map inner (let-bindings x))
42 (fold-map inner (let-body x)))]
45 ['lambda (append (f x)
46 (inner (lambda-body x)))]
48 (fold-map inner (cdr x)))]
51 (define (ast-find p x)
52 (define (inner y) (ast-find p y))
53 (define (any p x) (fold-left
54 (lambda (acc y) (if acc #t (p y)))
60 (apply either (cdr fs)))))
64 (any inner (let-bindings x))
65 (any inner (let-body x)))]
68 ['lambda (either (p x)
69 (inner (lambda-body x)))]
70 ['if (either (p x) (any inner (cdr x)))]
73 (define let-bindings cadr)
74 (define let-body cddr)
77 (and (list? x) (eq? (car x) 'lambda)))
79 ; for use in normalized form
80 (define lambda-arg caadr)
82 (define lambda-args cadr)
83 (define lambda-body caddr)
86 (define (fold-map f x) (fold-left append '() (map f x)))
87 (define (repeat x n) (if (<= n 0) '()
88 (cons x (repeat x (- n 1)))))
93 ((_ s x) (set! s (cons x s)))))
97 ((_ s) (let ([x (car s)])