Blocks vs Variadics as Dialect Formats

I'm not sure if <skip> is the best name for what this is. But I wound up doing an implementation for it:

https://github.com/metaeducation/ren-c/commit/5857740aedb3bfbafad5dc3c110cb0fab8f34b7d

I didn't do it for frivolous reasons, I did it because it was needed to keep code from breaking that used the new DEFAULT, e.g. case [... default [...]].

What happened is that ELIDE had been showing various weaknesses due to requiring that it run along with whatever was on its left hand side. This kept giving unpredictable ordering problems. At one point, it required changing CASE to essentially quote its branches. While it may not have been that big of a loss, it did create a rift between what a list of IFs could do and what a CASE could do...so it was a little uncomfortable.

Eventually it seemed this really was a problem with how the evaluator was handling functions like ELIDE, and a better solution was needed. That gave rise to a reworking of Eval_Core() and related routines to rethink DO/NEXT that could leave ELIDEs pending for the next evaluator step, and yet not lose the last evaluative product. That interface is now called EVALUATE

This was a relief to all the many situations in which ELIDE had been presenting ordering problems. It also unchained CASE so that the old non-literal-branch functionality could come back, with ELIDE working as one would expect it to:

https://github.com/metaeducation/ren-c/commit/8af4214b985bf7323167b959727592d7b3f842c2

But sadly this broke DEFAULT's enfix-vs-non-enfix polymorphism, which I'd become rather attached to. With the evaluator run on case [... [...] default [...] the block on the left of default would now be visible to it. (It hadn't been when it was lit-quoted, but Eval_Step() runs enfix).

If the trick was to be preserved so that x: default [...] could pick up the X: as well as use DEFAULT in this case, there needed to be some way for DEFAULT to reject whatever was on its left that wasn't a SET-WORD! or SET-PATH!. It couldn't wait to do this rejection until it was running (the way a variadic might) because that would be too late for the block to be bounced back to use as a branch.

The only idea on the map which would solve this would be skippability--with rules adapted to let a left enfix with a type it wanted to skip be deferred until the next evaluator step. While it might feel a bit convoluted, it doesn't feel mechanically "unsound"...any more so than any of the rest of Rebol is unsound. :slight_smile: