Hi
> Understood.
> 
> One argument for supporting #break in #on: whitespace avoidance
> 
> Because there's not an explicit closing tag for #case or #on, the use of 
> #break in the following avoids a trailing newline:
> <#switch x>
>     <#case 1>1<#break>
>     <#default>not 1<#break>
> </#switch>

1. #on should have a close tag, for that reason. 
2. #break should work as normal inside #on. That is to allow exiting an #on 
directive early, for example on a condition. 
3. #case should not be allowed together with #on

I don’t know if #default should be replaced as well when using #on (it doesn’t 
have a close tag!)
I suggest <#on .other>

Cheers,
— Denis. 

> 
> Do we just say that if they need that then they should use #case instead? It 
> could mean that we'd never we able to fully deprecate #case.
> 
> ---
> Many thanks,
> Simon Hartley
> 
> 
> On Friday, 9 February 2024 at 23:29:28 GMT, Daniel Dekany 
> <daniel.dek...@gmail.com> wrote:
> 
> 
> 
> 
> 
> Because both #switch and #list supports #break, of course it will break out
> from the innermost one (whether it's a #switch, or a #break).
> 
> #continue should only work with #list, however, it seems there's a bug
> here, and indeed, inside #switch it does the same as #break (that it's
> certainly present for 20 years or so).
> 
> As of #on, we just don't care about #break, it's unsupported. So it should
> only affect #list. Similarly as #continue should work... We can't really
> fix that anymore for #case (or only with incomplatible_improvements...
> yeah, annoying), but for #on, we can fix that.
> 
> I say, we don't want to support mixing #case and #on in the same #switch.
> To keep things as simple as possible... (Well, if we want to do
> anything with #switch at all.)
> 
>> On Fri, Feb 9, 2024 at 11:36 PM Simon Hartley
>> <scrhart...@yahoo.co.uk.invalid> wrote:
>> 
>> I've looked into adding #on support to #switch and I think the following
>> needs further consideration: how #break works in #switch with #on?
>> 
>> When using #switch with #case in a #list, #break finds the #switch and
>> breaks out of that, rather than the #list.
>> <#list [1,2,3] as item>
>>     <#switch item>
>>         <#case 2> It's 2 <#break>  <!-- Breaks from #switch, not #list -->
>>         <#default> Not 2
>>     </#switch>
>> </#list>
>> 
>> Mixing #list with #on, what's the behavior?
>> 1. #break is in a #switch and so it breaks from that
>> 2. #break is in an #on and so throws an error because #on does not allow
>> that
>> 3. #break acts like it's used by #list and so breaks from that, rather
>> than the #switch
>> <#list [1,2,3] as item>
>>     <#switch item>
>>         <#on 2> It's 2 <#break> <#-- break from #switch, break from #list
>> or throw error? -->
>>         <#default> Not 2
>>     </#switch>
>> </#list>
>> 
>> 
>> P.S.
>> It seems that #switch currently doesn't distinguish between #break and
>> #continue. As a result, the following treats #continue as if it's a #break,
>> rather than skipping to the next item in the #list.
>> 
>> <#list [1,2,3] as item>
>>     <#switch item>
>>         <#case 2>
>>             ${item}
>>             <#continue>
>>         <#default>
>>             ${item}
>>     </#switch>
>>     After
>> </#list>
>> The output is:
>> 1
>> After
>> 2
>> After
>> 3
>> After
>> 
>> Rather than:
>> 1
>> After
>> 2
>> 
>> 
>> ---
>> Best regards,
>> Simon Hartley
>> 
>> 
>> 
>> 
>> 
>> 
>> On Monday, 5 February 2024 at 23:21:13 GMT, Daniel Dekany <
>> daniel.dek...@gmail.com> wrote:
>> 
>> 
>> 
>> 
>> 
>> #on is maybe better than #option... I'm not a native english speaker
>> though, so I'm nor entirely sure.
>> 
>> Someone else asked what if it's mixed with #case. I would just disallow
>> that.
>> 
>> And of course, with #on (or #option) there would be no fall though at all.
>> Since we have multiple values per #on, there's almost no use-case for it.
>> 
>> On Tue, Feb 6, 2024 at 12:11 AM Denis Bredelet <brede...@me.com.invalid>
>> wrote:
>> 
>>> Hello,
>>> 
>>> Good suggestions here. I think #option works well.
>>> 
>>> You could also use #switch … #on … #on …
>>> 
>>> If you want to keep #case and add a modifier, I suggest break=req (the
>>> default, #break is required to exit the #switch) and break=opt (#break
>> only
>>> required when you want to exit the #case early).
>>> 
>>> Cheers
>>> — Denis.
>>> 
>>>> On 3 Feb 2024, at 21:20, Simon Hartley <scrhart...@yahoo.co.uk
>> .invalid>
>>> wrote:
>>>> 
>>>> If you leave the parent directive as switch, then there would need to
>>> be a decision for what should happen if the user tries to mix option and
>>> case in the same switch, i.e. should it "just work"?
>>>> 
>>>> I did remember that JSP used choose/when/otherwise, so your previous
>>> suggestion isn't without precedence. #option is as good as any (ahead of
>>> #choice and #when ???), but here are some more random words anyway:
>> #check,
>>> #criterion, #test
>>>> 
>>>> Your idea for multiple values per case seemed like a nice upgrade. What
>>> are your thoughts on "values" being expressions as I touched on in the
>>> Future Work section?
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>>> On Saturday, 3 February 2024 at 18:19:09 GMT, Daniel Dekany <
>>> daniel.dek...@gmail.com> wrote:
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> <#switch value fallthrough="explicit">
>>>> 
>>>> With that it's at least clear which behavior we get, but then I guess
>>> it's
>>>> too verbose.
>>>> 
>>>>> I would point out that Java switch expressions (not statements) don't
>>>> allow fall-through at all.
>>>> 
>>>> I'm pretty confident that if we support multiple values per #case (or
>>>> whatever it will be called), then fall-through is just not worth the
>>>> trouble.
>>>> 
>>>>> Java 21 Pattern Matching syntax
>>>> 
>>>> That's unfortunate, as #when was high on my list. Though it's not in
>>> place
>>>> of "case" in Java, so it's maybe not that confusing if we have it in
>>> place
>>>> of #case. Anyway, how about #option then?
>>>> 
>>>> <#switch contact.type>
>>>>   <#option 'INDIVIDUAL', 'PROXY'>
>>>>     ...
>>>>   <#option 'ORGANIZATION'>
>>>>     ...
>>>>   <#default>
>>>>     ...
>>>> </#switch>
>>>> 
>>>> 
>>>> On Sat, Feb 3, 2024 at 6:11 PM Simon Hartley <scrhart...@yahoo.co.uk
>>> .invalid>
>>>> wrote:
>>>> 
>>>>> Cool.
>>>>> 
>>>>> Just to cover all bases, what about the switch behavior remaining the
>>> same
>>>>> unless you opt-in using something like:
>>>>> <#switch value fallthrough="explicit">
>>>>> Would you still rather not add the mental overhead of such modal
>>> behavior?
>>>>> Given your reaction to Go's choice, I assume you'd rather not do that.
>>>>> I would point out that Java switch expressions (not statements) don't
>>>>> allow fall-through at all. (There is a compile error if you try to use
>>> the
>>>>> block syntax that doesn't contain a yield and without the block syntax
>>> then
>>>>> the yield is implicit.)
>>>>> 
>>>>> If we went the new directive route, should it allow fall-through at
>> all?
>>>>> 
>>>>> Naming with a new directive may require care, since when clauses are
>>> part
>>>>> of Java's new Java 21 Pattern Matching syntax and so may lead to
>> higher
>>>>> expectations.
>>>>> (see:
>>>>> 
>>> 
>> https://docs.oracle.com/en/java/javase/21/language/pattern-matching-switch-expressions-and-statements.html#GUID-A5C220F6-F70A-4FE2-ADB8-3B8883A67E8A
>>>>> )
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> On Saturday, 3 February 2024 at 09:44:38 GMT, Daniel Dekany <
>>>>> daniel.dek...@gmail.com> wrote:
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> I'm not against addressing the core issue, but the only practical way
>> I
>>> can
>>>>> imagine is with different directive names.
>>>>> 
>>>>> Breaking existing templates is out of the question.
>>>>> 
>>>>> It can't be a configurable behavior either, because then if you just
>>> look
>>>>> at a template, you can't be sure what will actually happen. Consider
>>>>> answering SO questions like that, or copy-pasting template snippets
>> from
>>>>> elsewhere.
>>>>> 
>>>>> What Go did is just wrong, IMAO. They had to find a different name to
>>> avoid
>>>>> confusion, like choice/when, or whatever. Same goes for FM.
>>>>> 
>>>>> On Fri, Feb 2, 2024 at 2:38 AM Simon Hartley <scrhart...@yahoo.co.uk
>>>>> .invalid>
>>>>> wrote:
>>>>> 
>>>>>> The below is structured as a proposal, but at the moment I just want
>> to
>>>>>> gather opinions and also see if this a non-starter or not. It
>> includes
>>>>>> options for adopting this in version 2 or the theoretical version 3.
>>>>>> Putting dev effort aside for the time being, is this a reasonable
>> thing
>>>>> to
>>>>>> address and does it align with the desired approach?
>>>>>> 
>>>>>> 
>>>>>> ## Summary ##
>>>>>> 
>>>>>> Enhance the switch directive to not force fall-through behavior.
>> Using
>>>>>> switch is currently clunky and the available alternatives have their
>>> own
>>>>>> compromises. It should not exist in its current form in the next
>> major
>>>>>> release.
>>>>>> 
>>>>>> ## History ##
>>>>>> 
>>>>>> The FreeMarker switch directive mimics the Java switch statement. It
>>>>>> supports fall-through and this is the control flow unless break is
>>>>>> encountered. The manual recommends against this directive due to this
>>>>>> error-prone behavior. Later, the switch built-in was added which does
>>> not
>>>>>> have the concept of fall-through.
>>>>>> 
>>>>>> ## Goals ##
>>>>>> 
>>>>>> * Avoid unnecessary syntactic noise caused by having to use the break
>>>>>> directive
>>>>>> 
>>>>>> * Avoid accidental fall-through by making it explicit when needed
>>>>>> 
>>>>>> ## Motivation ##
>>>>>> 
>>>>>> * Avoid the potential for repetition due to elseif as a replacement
>>>>>> 
>>>>>> * Offer increased syntactic clarity compared to the built-in
>>>>>> 
>>>>>> * Avoid the pitfalls of the current switch directive
>>>>>> 
>>>>>> 
>>>>>> ## Description ##
>>>>>> 
>>>>>> The basis of this proposal is inspired by the switch statement in the
>>> Go
>>>>>> language (see https://yourbasic.org/golang/switch-statement/).
>> Rather
>>>>>> than the default being to fall-through and you have to use the break
>>>>>> keyword to avoid it, instead the default is to not fall-through and
>> you
>>>>>> have to use the fallthrough keyword to get that behavior. Having
>>> explicit
>>>>>> fall-through stops it being a pitfall whilst allowing the feature to
>> be
>>>>>> used if required. Go has avoided repeating the mistake of previous
>>>>>> languages and presents a solution that seems obvious in hindsight.
>>>>>> 
>>>>>> Approaches for adopting this could be:
>>>>>> 
>>>>>> * Replace the switch directive in the next major version with the
>>>>> explicit
>>>>>> fall-through version
>>>>>> 
>>>>>> * Introduce a new switch directive with a new name
>>>>>> 
>>>>>> * Have a global setting for which switch directive is used /
>> available
>>> to
>>>>>> templates
>>>>>> 
>>>>>> * Add an optional parameter to the switch directive for whether it
>>> should
>>>>>> fall-through or not; its default would be a config setting. If we did
>>>>> this
>>>>>> perhaps we should consider in future being able to parse the switch's
>>>>> value
>>>>>> parameter as optional (defaulting to true), taking further
>> inspiration
>>>>> from
>>>>>> Go.
>>>>>> 
>>>>>> If we want fall-through to be explicit, it makes sense to add a
>>>>>> fallthrough directive to act as the inverse of the break directive.
>> The
>>>>>> user would then use the break directive (as required) when using the
>>>>>> current mode/directive for fall-through and the fallthrough directive
>>> (as
>>>>>> required) when using the new mode/directive. For what should happen
>>> when
>>>>>> using break in the new mode/directive and fallthrough in the old
>>>>>> mode/directive: it could either be an error, or break will still
>> break
>>>>> and
>>>>>> fallthrough will do nothing (or perhaps go to the next case).
>>>>>> 
>>>>>> 
>>>>>> ## Alternatives ##
>>>>>> 
>>>>>> * Remove the switch directive altogether
>>>>>> 
>>>>>> * Completely disallow fall-through and the break directive (have
>>> neither
>>>>>> implicit nor explicit fall-through)
>>>>>> 
>>>>>> * Add a more powerful match directive that supports pattern matching
>>> and
>>>>>> takes inspiration from e.g. Java's switch expressions or Rust's
>> pattern
>>>>>> syntax
>>>>>> 
>>>>>> ## Future work ##
>>>>>> 
>>>>>> Reinstating switch as a first-class directive would open the door to
>>>>>> allowing enhancements to it again.
>>>>>> 
>>>>>> One (low hanging?) example: for a case directive's value parameter to
>>> be
>>>>>> an expression it sometimes requires wrapping the expression in
>> brackets
>>>>>> (e.g. it doesn't for an equality comparison, but does for a greater
>>> than
>>>>>> comparison); the parser could be enhanced to remove this requirement.
>>>>>> 
>>>>>> 
>>>>>> ---
>>>>>> Best regards,
>>>>>> Simon Hartley
> 
>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>>>>> --
>>>>> Best regards,
>> 
>>>> 
>>>>> 
>>>>> Daniel Dekany
>>>>> 
>>>>> 
>>>> 
>>>> --
>>>> Best regards,
>>>> Daniel Dekany
>>> 
>> 
>> 
>> --
>> Best regards,
>> Daniel Dekany
>> 
> 
> 
> --
> Best regards,
> Daniel Dekany

Reply via email to