(.module: [lux #* [abstract ["." monad (#+ do)]] [control ["p" parser ("#@." functor) ["s" code (#+ Parser)]]] [data ["." bit ("#@." codec)] ["." text] [number ["." nat ("#@." decimal)] ["." int ("#@." decimal)] ["." rev ("#@." decimal)] ["." frac ("#@." decimal)]] [collection ["." list ("#@." monad)]]]] ["." // ["." code] [syntax (#+ syntax:)]]) (syntax: #export (splice {parts (s.tuple (p.some s.any))}) (wrap parts)) (syntax: #export (count {parts (s.tuple (p.some s.any))}) (wrap (list (code.nat (list.size parts))))) (syntax: #export (with-locals {locals (s.tuple (p.some s.local-identifier))} body) (do {@ //.monad} [g!locals (|> locals (list@map //.gensym) (monad.seq @))] (wrap (list (` (.with-expansions [(~+ (|> (list.zip2 locals g!locals) (list@map (function (_ [name identifier]) (list (code.local-identifier name) (as-is identifier)))) list@join))] (~ body))))))) (def: snippet (Parser Text) ($_ p.either s.text s.local-identifier s.local-tag (p@map bit@encode s.bit) (p@map nat@encode s.nat) (p@map int@encode s.int) (p@map rev@encode s.rev) (p@map frac@encode s.frac) )) (def: part (Parser (List Text)) (s.tuple (p.many ..snippet))) (syntax: #export (text {simple ..part}) (wrap (list (|> simple (text.join-with "") code.text)))) (template [ ] [(syntax: #export ( {simple ..part} {complex (p.maybe ..part)}) (case complex #.None (wrap (list (|> simple (text.join-with "") ))) (#.Some complex) (wrap (list ( [(text.join-with "" simple) (text.join-with "" complex)])))))] [identifier code.local-identifier code.identifier] [tag code.local-tag code.tag] )