From d1f378b7ed770f1ad78eb3e748f6ebc6c7024ef3 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Tue, 11 Jan 2022 19:49:48 -0800 Subject: Add guards to the match syntax. I'm not sure the syntax is great, but it's very helpful to have. --- match-test.csc | 10 ++++++++++ match.csc | 11 ++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) 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 ...) -- cgit v1.3.1