X-Git-Url: http://git.lukelau.me/?a=blobdiff_plain;f=ast.scm;h=c81bc2b38ef4a9bbd70590f83d49dddd2b87948b;hb=703d22df97baba39426f890c6badd8d272e0bf45;hp=8dac3b68833ca430d27015b8a97263a72c531f37;hpb=31e29e5a1880862f7786abd7f1df911f5acf651d;p=scheme.git diff --git a/ast.scm b/ast.scm index 8dac3b6..c81bc2b 100644 --- a/ast.scm +++ b/ast.scm @@ -21,8 +21,15 @@ ((integer? x) 'int-literal) ((boolean? x) 'bool-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 e)))) + ('app (map f x)) + ('lambda `(lambda ,(lambda-args x) ,(f lambda-body))) + ('if `(if ,@(map f (cdr x)))) + (else x))) (define let-bindings cadr) (define let-body cddr)