# `orelse` markers Right now, `f() orelse g()` desugars to control flow like: ```mermaid graph LR Start A["f()"] B["g()"] End Start --> A A --failed--> B A --passed--> End B --> End ``` We can reduce that to normal code: ```ts let t#0, t#1; let fail#1: Boolean; t#1 = hs(fail#1, f()); if (fail#1) { t#0 = g(); } else { t#0 = t#1; } t#0 ``` But it'd be nice to keep information about `orelse` in the AST. One way to do that is with marker expressions: expressions that do not affect the semantics but which are not removed by the Interpreter. A *marker expression* is a call to a pure, zero argument functions whose semantics are: - In *InterpMode.Full*, returns `void` with no side-effect. - In *InterpMode.Partial*, returns *NotYet* with no side-effect. ```mermaid graph LR Start try["<b>or_start()</b>"] A["f()"] catch["<b>orelse_xfer()</b>"] B["g()"] End Start --> try --> A A --failed--> catch --> B A --passed--> End B --> End ``` That would correspond to code like ```diff= let t#0, t#1; let fail#1: Boolean; +orelse_start(); t#1 = hs(fail#1, f()); if (fail#1) { + orelse_xfer(); t#0 = g(); } else { t#0 = t#1; } t#0 ``` Marking the end of an *orelse* would be nice too.