One thing's for sure about UPARSE, you can really try new ideas out fast.
Here's one... what if it were easier to make objects via PARSE? Here's GATHER and EMIT...which feature rollback (just like COLLECT and KEEP) but are tailored for making objects:
>> uparse [* * * 1 <foo> * * *] [ some '* g: gather [ emit i: integer!, emit t: text! | emit i: integer!, emit t: tag! ] some '* ] == * >> g == make object! [ i: 1 t: <foo> ]
This is more in line with Haskell-style parser combinators. There, the type strictness says that each parser combinator has to produce a typed value, so you tend to build records in this fashion.
It may be useful enough that if you use EMIT at the top level with no gather, then it assumes you want the object to be the result of the parse:
>> uparse [* * * 1 <foo> * * *] [ some '* [emit i: integer!, emit t: text! | emit i: integer!, emit t: tag!] some '* ] == make object! [ i: 1 t: <foo> ]
So I added that in for now. Really it can be reduced to the question of whether the EMIT combinator decides to raise an error when there's no gather in effect or not, so you could tweak just that one aspect.
Anyway, now's the time to experiment...so...