
On 2016-11-02 16:17, Nick Coghlan wrote: [snip]
Yeah, and so far the protocol based alternative I'm working on hasn't been any less headache-inducing (Mark has been reviewing some early iterations and had to draw a diagram to try to follow the proposed control flow).
I think I have a way to simplify that idea further though, and if that works out I should have something I'm willing to share with a wider audience.
The gist is that rather than writing the bare:
target = expr1 ?? expr2 ?? expr3
You'd instead write None-coalescing as:
target = exists(expr1) ?? exists(expr2) ?? expr3
and None-propagating as:
target = missing(expr1) ?? missing(expr2) ?? expr3
with ?? being a protocol-driven short-circuiting binary operator controlled by the left operand rather than defining any particular semantics of its own.
The "obj?." and "obj?[]" would then be shorthand for particular uses of "missing(obj) ?? ..." that avoid duplicate evaluation of the left operand (as well as bypassing the overhead of actually creating a "missing" instance).
How about borrowing from C: target = expr1 || expr2 || expr3 target = expr1 && expr2 && expr3 except that only None would be considered falsey? Or would that be confusing?