-(define (app? x)
- (and (list? x)
- (>= (length x) 2)
- (not (eq? (car x) 'let))
- (not (eq? (car x) 'lambda))))
+(define (ast-type x)
+ (define (builtin? x)
+ (case x
+ ('+ #t)
+ ('- #t)
+ ('* #t)
+ ('! #t)
+ ('= #t)
+ ('bool->int #t)
+ (else #f)))
+ (cond
+ ((list? x)
+ (case (car x)
+ ('if 'if)
+ ('let 'let)
+ ('lambda 'lambda)
+ ('closure 'closure) ; only available in codegen
+ (else 'app)))
+ ((builtin? x) 'builtin)
+ ((symbol? x) 'var)
+ ((integer? x) 'int-literal)
+ ((boolean? x) 'bool-literal)))
-(define (let? x)
- (and (list? x) (eq? (car x) 'let)))
+;; (define (ast-recurse f x)
+;; (cond (
(define let-bindings cadr)
(define let-body cddr)
; for use elsewhere
(define lambda-args cadr)
(define lambda-body caddr)
-
-(define (var? x)
- (and (not (list? x)) (symbol? x)))
-
-(define (builtin? x)
- (case x
- ('+ #t)
- ('- #t)
- ('* #t)
- ('! #t)
- ('bool->int #t)
- (else #f)))