Refactor ast "pattern matching" to a single function
[scheme.git] / ast.scm
diff --git a/ast.scm b/ast.scm
index 2ffad975f66f1ec4fbca3f32f095e484658ed726..8dac3b68833ca430d27015b8a97263a72c531f37 100644 (file)
--- a/ast.scm
+++ b/ast.scm
@@ -1,11 +1,28 @@
-(define (app? x)
-  (and (list? x)
-       (>= (length x) 2)
-       (not (eq? (car x) 'let))
-       (not (eq? (car x) 'lambda))))
+(define (ast-type x)
+  (define (builtin? x)
+    (case x
+      ('+ #t)
+      ('- #t)
+      ('* #t)
+      ('! #t)
+      ('= #t)
+      ('bool->int #t)
+      (else #f)))
+  (cond
+   ((list? x)
+    (case (car x)
+      ('if 'if)
+      ('let 'let)
+      ('lambda 'lambda)
+      ('closure 'closure) ; only available in codegen
+      (else 'app)))
+   ((builtin? x) 'builtin)
+   ((symbol? x) 'var)
+   ((integer? x) 'int-literal)
+   ((boolean? x) 'bool-literal)))
 
-(define (let? x)
-  (and (list? x) (eq? (car x) 'let)))
+;; (define (ast-recurse f x)
+;;   (cond (
 
 (define let-bindings cadr)
 (define let-body cddr)
 ; for use elsewhere
 (define lambda-args cadr)
 (define lambda-body caddr)
-
-(define (var? x)
-  (and (not (list? x)) (symbol? x)))
-
-(define (builtin? x)
-  (case x
-    ('+ #t)
-    ('- #t)
-    ('* #t)
-    ('! #t)
-    ('bool->int #t)
-    (else #f)))