From 07c21494cf8756e076a9703898736f92badbcb36 Mon Sep 17 00:00:00 2001 From: Scott Richmond Date: Sun, 19 Jun 2022 15:01:00 -0400 Subject: [PATCH] Add splats to tuple patterns in parser --- src/ludus/parser.clj | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ludus/parser.clj b/src/ludus/parser.clj index 31ac634..8d7901f 100644 --- a/src/ludus/parser.clj +++ b/src/ludus/parser.clj @@ -625,11 +625,13 @@ (case (token-type parser) ::token/rparen (let [ms (add-member members current_member)] + (if (not-any? #(= (::ast/type %) ::ast/splat) (drop-last ms)) (assoc (advance parser) ::ast {::ast/type ::ast/tuple :token (current origin) :length (count ms) - :members ms})) + :members ms}) + (panic parser "A splat my only appear once in a tuple pattern, at the end of the pattern."))) (::token/comma ::token/newline) @@ -643,6 +645,10 @@ ::token/eof (panic (assoc origin ::errors (::errors parser)) "Unterminated tuple" ::token/eof) + ::token/splat + (let [splatted (parse-splat-pattern parser)] + (recur splatted members (::ast splatted))) + (let [parsed (parse-pattern parser)] (recur parsed members (::ast parsed))))))) @@ -1107,7 +1113,7 @@ (do (def pp pp/pprint) - (def source "let [a, b, (c, d), ...e] = [1, 2, (4, 5), 6]") + (def source "let (a, ...b) = :foo") (println "") (println "")