X-Git-Url: http://git.lukelau.me/?p=scheme.git;a=blobdiff_plain;f=ast.scm;h=a0899192e21a1d44b0fe3296e380604133a3f1d2;hp=2ffad975f66f1ec4fbca3f32f095e484658ed726;hb=91145e54f41ee88f1e279a80430b3f5ed4e7a8c6;hpb=43f8c4631ae0a3163c780e7511a96f6b05054544 diff --git a/ast.scm b/ast.scm index 2ffad97..a089919 100644 --- a/ast.scm +++ b/ast.scm @@ -1,11 +1,38 @@ -(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) + ('print #t) + (else #f))) + (cond + ((list? x) + (case (car x) + ('if 'if) + ('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) + ((string? x) 'string-literal))) -(define (let? x) - (and (list? x) (eq? (car x) 'let))) +(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) @@ -18,15 +45,3 @@ ; 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)))