aboutsummaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
authorEduardo Julian2017-04-01 18:38:42 -0400
committerEduardo Julian2017-04-01 18:38:42 -0400
commit129865dc11ee4441b71fe3e8539c01634f2f1df0 (patch)
treec180706df7f81308274abaa844c90591908b73ef /stdlib
parentae7c062bdf4ab8337f0eedae78b38df24e62822c (diff)
- Added a macro for pattern-matching using regular-expressions.
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/source/lux/lexer/regex.lux27
-rw-r--r--stdlib/test/test/lux/lexer/regex.lux16
2 files changed, 41 insertions, 2 deletions
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> "List/" Monad<List>]))
[compiler #- run]
(macro [ast]
- [syntax #+ syntax:])
+ ["s" syntax #+ syntax:])
["&" lexer #+ Lexer Monad<Lexer>]))
## [Utils]
@@ -415,7 +415,7 @@
(:: Monad<Lexer> 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))))
diff --git a/stdlib/test/test/lux/lexer/regex.lux b/stdlib/test/test/lux/lexer/regex.lux
index c5c21df2a..1a21111f8 100644
--- a/stdlib/test/test/lux/lexer/regex.lux
+++ b/stdlib/test/test/lux/lexer/regex.lux
@@ -267,3 +267,19 @@
(&;regex "(\\d{3})-((\\d{3})-(\\d{4}))|b(.)d")
"809-345-6789")))
))
+
+(test: "Pattern-matching"
+ [sample1 (R;text +3)
+ sample2 (R;text +3)
+ sample3 (R;text +4)]
+ (case (format sample1 "-" sample2 "-" sample3)
+ (&;^regex "(.{3})-(.{3})-(.{4})"
+ [_ match1 match2 match3])
+ (assert "Can pattern-match using regular-expressions."
+ (and (T/= sample1 match1)
+ (T/= sample2 match2)
+ (T/= sample3 match3)))
+
+ _
+ (assert "Cannot pattern-match using regular-expressions."
+ false)))