X-Git-Url: http://git.lukelau.me/?p=scheme.git;a=blobdiff_plain;f=ast.scm;h=a0899192e21a1d44b0fe3296e380604133a3f1d2;hp=19dc7a0f5d3bea33793e1de676016be618baa103;hb=91145e54f41ee88f1e279a80430b3f5ed4e7a8c6;hpb=3ce93ef63f164f8dc63c89f1a97f46e200c71d02 diff --git a/ast.scm b/ast.scm index 19dc7a0..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) @@ -13,8 +40,8 @@ (define (lambda? x) (and (list? x) (eq? (car x) 'lambda))) -(define lambda-arg cadr) -(define lambda-body cddr) - -(define (var? x) - (and (not (list? x)) (symbol? x))) +; for use in normalized form +(define lambda-arg caadr) +; for use elsewhere +(define lambda-args cadr) +(define lambda-body caddr)