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> 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