diff options
author | Eduardo Julian | 2014-12-26 01:00:30 -0400 |
---|---|---|
committer | Eduardo Julian | 2014-12-26 01:00:30 -0400 |
commit | 0a0300b129df4499782cbe47aeaee581f57cc3db (patch) | |
tree | d7f3fd5f5cecb5b7a7a8703516e98624b5901039 /src/lang/parser.clj | |
parent | 4dc96027d8e90734aea3a5e109b8786fc112e88b (diff) |
Reimplemented basic pattern-matching.
Diffstat (limited to '')
-rw-r--r-- | src/lang/parser.clj | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/lang/parser.clj b/src/lang/parser.clj index 376e376d6..48f624ba4 100644 --- a/src/lang/parser.clj +++ b/src/lang/parser.clj @@ -137,10 +137,19 @@ [?member [(map ident->string ?inputs) (ident->string ?output)]]))] (return [::definterface ?name members]))) -(defparser ^:private parse-tagged - [::&lexer/list ([[::&lexer/tag ?tag] ?data] :seq)] - (exec [=data (apply-m parse-form (list ?data))] - (return [::tagged ?tag =data]))) +(defparser ^:private parse-variant + ?token + (match ?token + [::&lexer/tag ?tag] + (return [::variant ?tag '()]) + + [::&lexer/list ([[::&lexer/tag ?tag] & ?data] :seq)] + (exec [=data (map-m #(apply-m parse-form (list %)) + ?data)] + (return [::variant ?tag =data])) + + _ + (fail (str "Unmatched token: " ?token)))) (defparser ^:private parse-get [::&lexer/list ([[::&lexer/ident "get@"] [::&lexer/tag ?tag] ?record] :seq)] @@ -191,7 +200,7 @@ parse-do parse-case parse-let - parse-tagged + parse-variant parse-get parse-set parse-remove |