('! #t)
('= #t)
('bool->int #t)
+ ('print #t)
(else #f)))
(cond
((list? x)
('let 'let)
('lambda 'lambda)
('closure 'closure) ; only available in codegen
+ ('static-string 'static-string) ; only available in codegen
(else 'app)))
((builtin? x) 'builtin)
((symbol? x) 'var)
((integer? x) 'int-literal)
- ((boolean? x) 'bool-literal)))
+ ((boolean? x) 'bool-literal)
+ ((string? x) 'string-literal)))
-;; (define (ast-recurse f x)
-;; (cond (
+(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)))
(define let-bindings cadr)
(define let-body cddr)