('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)
('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)
(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)
['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)
(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))
program)))
- ; (A ((foo (Int Bool))
- ; (bar (Bool)))
-
-(define data-layout cdr)
; gets both constructors and destructors
; (data A (foo Int Bool)
[dtors (map (lambda (t i) (destructor ctor-name type-name t i))
products
(range 0 (length products)))])
-
(cons maker (append dtors acc))))
'()
ctors)))