aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRose Hogenson <rhogenson@posteo.net>2022-01-11 19:49:48 -0800
committerRose Hogenson <rhogenson@posteo.net>2022-01-11 19:49:48 -0800
commitd1f378b7ed770f1ad78eb3e748f6ebc6c7024ef3 (patch)
treea4471ee93b9e94e3f01a3386e0afd7e74b79d6e1
parentWrite the linker. (diff)
downloadchromatopelma-d1f378b7ed770f1ad78eb3e748f6ebc6c7024ef3.tar.zst
Add guards to the match syntax.
I'm not sure the syntax is great, but it's very helpful to have.
-rw-r--r--match-test.csc10
-rw-r--r--match.csc11
2 files changed, 20 insertions, 1 deletions
diff --git a/match-test.csc b/match-test.csc
index 73daa58..bbecce4 100644
--- a/match-test.csc
+++ b/match-test.csc
@@ -66,3 +66,13 @@
((! 'a) 1)
((! 'b) 2)
(_ 3))))
+
+
+(test match-when
+ (assert-equal
+ 3
+ (match 'b
+ ((! 'a) 1)
+ ((! 'b) (when #f) 2)
+ ((! 'b) 3)
+ (_ 4))))
diff --git a/match.csc b/match.csc
index 07ca98c..d188349 100644
--- a/match.csc
+++ b/match.csc
@@ -40,10 +40,19 @@
(define-syntax match
- (syntax-rules ()
+ (syntax-rules (when)
+ ((match x (pattern (when condition) result result* ...))
+ (if (and (matches? x pattern)
+ condition)
+ (bind-pattern x pattern result result* ...)))
((match x (pattern result1 result2 ...))
(if (matches? x pattern)
(bind-pattern x pattern result1 result2 ...)))
+ ((match x (pattern (when condition) result result* ...) clause clause* ...)
+ (if (and (matches? x pattern)
+ condition)
+ (bind-pattern x pattern result result* ...)
+ (match x clause clause* ...)))
((match x (pattern result1 result2 ...) clause1 clause2 ...)
(if (matches? x pattern)
(bind-pattern x pattern result1 result2 ...)