So, just to map this onto the example, you mean:
match(longer_variable -> x) { x < 10 : 'info', x <= 20 : 'warn', default:
'critical' } ?  I took the liberty of adding a default keyword there  the
evaluation of the conditionals are considered lambda functions also.

Did I catch the spirit of the suggestion or did I miss anything?

On Tue, Oct 17, 2017 at 2:18 PM, Otto Fowler <ottobackwa...@gmail.com>
wrote:

> How about this:
>
> match(VAR_TO_VAL_ASSIGNMENT+) { BOOLEAN_STATEMENT(VALS) : LAMBDA(VALS),
> BOOLEAN_STATEMENT(VALS) : LAMBDA(VALS) , LAMBDA(VALS)}
>
> * match = new keyword
> * match takes variable number of assignments, where the val assigned to is
> available in the evaluation and the lambdas
> * match {} contains comma separated list of a statement that evaluates to
> a boolean and a lambda
> * LAMBDA is executed on match, and it’s value is returned
> * no matches returns null or return of optional final statement, which is
> a LAMBDA without a BOOLEAN_STATEMENT
>
>
> On October 17, 2017 at 12:06:05, Casey Stella (ceste...@gmail.com) wrote:
>
> Ugh, I forgot to preface this with DISCUSS: Sorry!
>
> On Tue, Oct 17, 2017 at 12:05 PM, Casey Stella <ceste...@gmail.com>
> wrote:
>
> > Hi All,
> >
> > It's high time that Stellar supports some form of conditional that is
> > beyond if/then/else. Right now, the way to do fall-through conditionals
> is:
> >
> > if x < 10 then 'info' else if x >= 10 && x <= 20 then 'warn' else
> > 'critical'
> >
> > That becomes non-scalable very quickly. I wanted to facilitate a
> > discussion with the community on the syntax. I'll give a few options and
> > you guys/gals can come up with your own suggestions too, but I wanted to
> > frame teh conversation.
> >
> > *MAP-BASED SWITCH*
> >
> > With the advent of METRON-1254 (https://github.com/apache/
> metron/pull/801),
> > we could enable (from a language perspective in Stellar) multi-part
> > conditionals or switch/case style statements. To wit:
> >
> > MAP_GET(true, { x < 10 : 'info', x >= 10 && x <= 20 : 'warn', x > 20 :
> > 'critical' })
> >
> > Or, with a convenience function:
> >
> > CASE( { x < 10 : 'info', x >= 10 && x <= 20 : 'warn', x > 20 :
> 'critical'
> > } )
> >
> > The issue with this is that the last true condition wins because we're
> > using a map.
> >
> > *LIST-BASED SWITCH*
> >
> > We could correct this by adding a list of pairs construction to stellar:
> >
> > CASE( [ x < 10 : 'info', x <= 20 : 'warn'], 'critical')
> >
> > This would enable us to allow the first true condition to win, so the
> > second condition can be simpler and we could pass a default return value
> as
> > the final argument.
> > The downside to this, is that it requires a language enhancement (the
> list
> > of pairs construction you see there).
> >
> > *LAMBDA FUNCTION-BASED SWITCH*
> >
> > Some of the problems with the previous statements are that every
> > conditional has to be evaluated and there is no opportunity to short
> > circuit. They're all evaluated at parse-time rather than execution time.
> > We could, instead, construct a lambda function approach to this and
> support
> > short-circuiting in even complex conditionals:
> >
> > CASE( real_variable_name, [ x -> x < 10 ? 'info', x -> x <= 20 ? 'warn'
> ],
> > 'critical')
> > or
> > CASE( real_variable_name, [ x -> if x < 10 then 'info', x -> if x <= 20
> > then 'warn' ], 'critical')
> >
> > This would require lessening ?: (if/then/else) syntax to support to
> enable
> > just if without else conditions. This also has the benefit of allowing
> > simplifying the expression due to lambda function variable renaming
> > (real_variable_name can be much more complex (or even an expression)
> than
> > 'x'.
> >
> > Creative other approaches to this are appreciated!
> >
> > Thanks,
> >
> > Casey
> >
>
>

Reply via email to