X-Git-Url: https://git.lukelau.me/?p=scheme.git;a=blobdiff_plain;f=ast.scm;h=6b546ac6f4214a2a9891e10da74ea8df7b5c1ed0;hp=4ca6eb1e1dc57100a344310ea1494ea2139236e0;hb=7be98b67cbad421a0b041d20e0f4620e70bd4cd6;hpb=89ef32141732e6d0bbfc7484b465844b62d8d139 diff --git a/ast.scm b/ast.scm index 4ca6eb1..6b546ac 100644 --- a/ast.scm +++ b/ast.scm @@ -17,6 +17,7 @@ ('lambda 'lambda) ('closure 'closure) ; only available in codegen ('static-string 'static-string) ; only available in codegen + ('stack 'stack) ; only available in codegen (tag that value is passed via stack) (else 'app))) ((builtin? x) 'builtin) ((symbol? x) 'var) @@ -32,6 +33,7 @@ ('app (map f x)) ('lambda `(lambda ,(lambda-args x) ,(f (lambda-body x)))) ('if `(if ,@(map f (cdr x)))) + ('stack `(stack ,(cadr x) ,(map f (caddr x)))) (else x))) (define (ast-collect f x) @@ -46,7 +48,8 @@ (inner (lambda-body x)))] ['if (append (f x) (flat-map inner (cdr x)))] - ['closure (flat-map inner (caddr x))] + ['stack (append (f x) + (inner (caddr x)))] [else (f x)])) (define (ast-find p x) @@ -69,6 +72,7 @@ ['lambda (either (p x) (inner (lambda-body x)))] ['if (either (p x) (any inner (cdr x)))] + ['stack (either (p x) (inner (caddr x)))] [else (p x)])) (define (let-bindings e) @@ -96,9 +100,13 @@ (eqv? (car x) 'define)) 'define] [else 'expr])) -(define (program-datas program) - (filter (lambda (x) (eqv? (statement-type x) 'data)) - program)) + + ; (A ((foo (Int Bool)) + ; (bar (Bool))) +(define (program-data-layouts program) + (map (lambda (x) (cons (car x) (cdr x))) ; convert to assoc list + (map cdr (filter (lambda (x) (eqv? (statement-type x) 'data)) + program)))) (define (program-defines program) (filter (lambda (x) (eqv? (statement-type x) 'defines)) @@ -111,10 +119,6 @@ program))) - ; (A ((foo (Int Bool)) - ; (bar (Bool))) - -(define data-layout cdr) ; gets both constructors and destructors ; (data A (foo Int Bool) @@ -147,7 +151,6 @@ [dtors (map (lambda (t i) (destructor ctor-name type-name t i)) products (range 0 (length products)))]) - (cons maker (append dtors acc)))) '() ctors)))