Hi Daniel, > #else and #ifelse have no closing tag either.
But #if does, right? Why not #on? > Nor does #recover. That's the > style that was chosen back then. Brevity over correctness(?). > > <#on .other> would be rather strange. "Why don't they just have a keyword > for the statement itself???". Also, developers won't invest much mental > energy into learning a template language, so, the less surprising, the > better. True… one last attempt then I’ll hide again: <#on …> Does ellipsis count as “least surprise”? Cheers, — Denis. > >> On Sat, Feb 10, 2024 at 9:45 AM Denis Bredelet <brede...@mac.com.invalid> >> wrote: >> >> 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 >> > > > -- > Best regards, > Daniel Dekany