aboutsummaryrefslogtreecommitdiff
path: root/src/lang/parser.clj
diff options
context:
space:
mode:
authorEduardo Julian2014-11-27 02:03:19 -0400
committerEduardo Julian2014-11-27 02:03:19 -0400
commit1a2b6841604558266f2cbf5bcf1373ea257183c9 (patch)
treeda5cbb9a4c330a6790a06f0e081784807a496381 /src/lang/parser.clj
parenta96bb768a5f02c2dc9c0de1e50dc14376d2e7f35 (diff)
+ Added some very basic pattern-matching with destructuring.
Diffstat (limited to 'src/lang/parser.clj')
-rw-r--r--src/lang/parser.clj12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/lang/parser.clj b/src/lang/parser.clj
index 985a17861..53f60941d 100644
--- a/src/lang/parser.clj
+++ b/src/lang/parser.clj
@@ -57,6 +57,17 @@
=else (apply-m parse-form (list ?else))]
(return [::if =test =then =else])))
+(defparser ^:private parse-case
+ [::&lexer/list ([[::&lexer/ident "case"] ?variant & cases] :seq)]
+ (exec [=variant (apply-m parse-form (list ?variant))
+ =branches (do (assert (even? (count cases)))
+ (map-m (fn [[destruct expr]]
+ (exec [=destruct (apply-m parse-form (list destruct))
+ =expr (apply-m parse-form (list expr))]
+ (return [::case-branch =destruct =expr])))
+ (partition 2 cases)))]
+ (return [::case =variant =branches])))
+
(defparser ^:private parse-tagged
[::&lexer/list ([[::&lexer/tag ?tag] ?data] :seq)]
(exec [=data (apply-m parse-form (list ?data))]
@@ -76,6 +87,7 @@
parse-def
parse-defdata
parse-if
+ parse-case
parse-tagged
parse-fn-call]))