projects
/
scheme.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
A bit more work on ADT codegen
[scheme.git]
/
ast.scm
diff --git
a/ast.scm
b/ast.scm
index 4ca6eb1e1dc57100a344310ea1494ea2139236e0..6b546ac6f4214a2a9891e10da74ea8df7b5c1ed0 100644
(file)
--- 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
('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)
(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))))
('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)
(else x)))
(define (ast-collect f x)
@@
-46,7
+48,8
@@
(inner (lambda-body x)))]
['if (append (f x)
(flat-map inner (cdr 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)
[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)))]
['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)
[else (p x)]))
(define (let-bindings e)
@@
-96,9
+100,13
@@
(eqv? (car x) 'define)) 'define]
[else 'expr]))
(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))
(define (program-defines program)
(filter (lambda (x) (eqv? (statement-type x) 'defines))
@@
-111,10
+119,6
@@
program)))
program)))
- ; (A ((foo (Int Bool))
- ; (bar (Bool)))
-
-(define data-layout cdr)
; gets both constructors and destructors
; (data A (foo Int Bool)
; 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)))])
[dtors (map (lambda (t i) (destructor ctor-name type-name t i))
products
(range 0 (length products)))])
-
(cons maker (append dtors acc))))
'()
ctors)))
(cons maker (append dtors acc))))
'()
ctors)))