Start work on ADTs
[scheme.git] / ast.scm
diff --git a/ast.scm b/ast.scm
index 2beb94507572eafd20b586d2ce9ef3867ec63d3e..469a96f7162cb09c77dac0ed71b971dcbbd179a0 100644 (file)
--- a/ast.scm
+++ b/ast.scm
   (define (inner y) (ast-collect f y))
   (case (ast-type x)
     ['let (append (f x)
-                 (fold-map inner (let-bindings x))
-                 (fold-map inner (let-body x)))]
+                 (flat-map inner (let-bindings x))
+                 (flat-map inner (let-body x)))]
     ['app (append (f x)
-                 (fold-map inner x))]
+                 (flat-map inner x))]
     ['lambda (append (f x)
                     (inner (lambda-body x)))]
     ['if (append (f x)
-                (fold-map inner (cdr x)))]
+                (flat-map inner (cdr x)))]
     [else (f x)]))
 
 (define (ast-find p x)
     ['if (either (p x) (any inner (cdr x)))]
     [else (p x)]))
 
-(define let-bindings cadr)
+(define (let-bindings e)
+  (define (extract x)  ) ; TODO
+  (flat-map extract (cadr e))
 (define let-body cddr)
 
 (define (lambda? x)
   (and (list? x) (eq? (car x) 'lambda)))
 
+
+(define (statement-type x)
+  (cond
+   [(and (list? x)
+        (eqv? (car x) 'data)) 'data]
+   [(and (list? x)
+        (eqv? (car x) 'define)) 'define]
+   [else 'expr]))
+
+(define (program-datas program)
+  (filter (lambda (x) (eqv? (statement-type x) 'data))
+         program))
+
+(define (program-defines program)
+  (filter (lambda (x) (eqv? (statement-type x) 'defines))
+         program))
+
+(define (program-body program)
+  `(let ()
+     ,@(filter (lambda (x) (eqv? (statement-type x) 'expr))
+              program)))
+
 ; for use in normalized form
 (define lambda-arg caadr)
 ; for use elsewhere
 (define lambda-body caddr)
 
 ; utils
-(define (fold-map f x) (fold-left append '() (map f x)))
+(define (flat-map f x) (fold-left append '() (map f x)))
 (define (repeat x n) (if (<= n 0) '()
                         (cons x (repeat x (- n 1)))))