projects
/
scheme.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
1b7e2b5
)
Start work on case statements
author
Luke Lau
<luke_lau@icloud.com>
Wed, 14 Aug 2019 15:08:31 +0000
(16:08 +0100)
committer
Luke Lau
<luke_lau@icloud.com>
Wed, 14 Aug 2019 15:08:31 +0000
(16:08 +0100)
ast.scm
patch
|
blob
|
history
tests.scm
patch
|
blob
|
history
diff --git
a/ast.scm
b/ast.scm
index 52e06bcb24d3b4783eb301c8fb657ec7f7e06071..86d522560a8012546e6a754499b1216052d8ce70 100644
(file)
--- a/
ast.scm
+++ b/
ast.scm
@@
-17,6
+17,7
@@
('if 'if)
('let 'let)
('lambda 'lambda)
('if 'if)
('let 'let)
('lambda 'lambda)
+ ('case 'case)
('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)
('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)
@@
-35,6
+36,10
@@
('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))))
+ ('case `(case ,(f (case-expr x))
+ ,@(map (lambda (x)
+ (list (car x) (f (cadr x))))
+ (case-cases x))))
('stack `(stack ,(cadr x) ,(f (caddr x))))
(else x)))
('stack `(stack ,(cadr x) ,(f (caddr x))))
(else x)))
@@
-50,6
+55,9
@@
(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)))]
+ ['case (append (f x)
+ (inner (case-expr x))
+ (flat-map inner (map cadr (case-cases x))))]
['stack (append (f x)
(inner (caddr x)))]
[else (f x)]))
['stack (append (f x)
(inner (caddr x)))]
[else (f x)]))
@@
-80,6
+88,9
@@
(define let-bindings cadr)
(define let-body cddr)
(define let-bindings cadr)
(define let-body cddr)
+(define case-expr cadr)
+(define case-cases cddr)
+
; (let ([(foo a b) (foo 123 345)]) a)
; |
; v
; (let ([(foo a b) (foo 123 345)]) a)
; |
; v
diff --git
a/tests.scm
b/tests.scm
index b3e630bbffefebbe31d959e7fd17ffa22e504976..49fc2c4bc861b13de41f454a7aa2b6e6b103d8d9 100644
(file)
--- a/
tests.scm
+++ b/
tests.scm
@@
-278,3
+278,12
@@
(let ([(bar (foo x)) (bar (foo 42))])
x))
42)
(let ([(bar (foo x)) (bar (foo 42))])
x))
42)
+
+(test-prog '((data Foo [a] [b] [c])
+ (let ([x b])
+ (case x
+ [a 1]
+ [b 2]
+ [c 3])))
+ 2)
+