From 129865dc11ee4441b71fe3e8539c01634f2f1df0 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Sat, 1 Apr 2017 18:38:42 -0400 Subject: - Added a macro for pattern-matching using regular-expressions. --- stdlib/source/lux/lexer/regex.lux | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'stdlib/source') diff --git a/stdlib/source/lux/lexer/regex.lux b/stdlib/source/lux/lexer/regex.lux index c41e38590..616f02086 100644 --- a/stdlib/source/lux/lexer/regex.lux +++ b/stdlib/source/lux/lexer/regex.lux @@ -9,7 +9,7 @@ (coll [list "" Fold "List/" Monad])) [compiler #- run] (macro [ast] - [syntax #+ syntax:]) + ["s" syntax #+ syntax:]) ["&" lexer #+ Lexer Monad])) ## [Utils] @@ -415,7 +415,7 @@ (:: Monad map product;right (re-alternative^ true re-scoped^ current-module))) ## [Syntax] -(syntax: #export (regex [pattern syntax;text]) +(syntax: #export (regex [pattern s;text]) {#;doc (doc "Create lexers using regular-expression syntax." "For example:" @@ -484,3 +484,26 @@ (#;Right regex) (wrap (list regex)) ))) + +(syntax: #export (^regex [[pattern bindings] (s;form (s;seq s;text (s;opt s;any)))] + body + [branches (s;many s;any)]) + {#;doc (doc "Allows you to test text against regular expressions." + (case some-text + (^regex "(\\d{3})-(\\d{3})-(\\d{4})" + [_ country-code area-code place-code]) + do-some-thing-when-number + + (^regex "\\w+") + do-some-thing-when-word + + _ + do-something-else))} + (do @ + [g!temp (compiler;gensym "temp")] + (wrap (list& (` (^=> (~ g!temp) + [(&;run (~ g!temp) (regex (~ (ast;text pattern)))) + (#;Right (~ (default g!temp + bindings)))])) + body + branches)))) -- cgit v1.2.3