Miles,

> On 4. 12. 2024, at 18:21, Milles, Eric (TR Technology) via dev 
> <dev@groovy.apache.org> wrote:
> ... Switching to use "y.each { x-> ... }" or "y.forEach(x -> ...)" is a 
> personal preference.

Absolutely.

Nevertheless my own personal preference very strongly prefers :) the each, for 
it is a pure OO approach, including e.g., an easy and intuitive possibility to 
implement/override each for any particular target where it might make sense. 
(Sort of like the lately debated preference of Foo.newInstance instead of new 
Foo.)

(Although I can't recall how offhand, I guess Groovy would most probably be 
flexible enough to allow me to override/implement the for/in behaviour for any 
class as well, like e.g., Objective C does; nevertheless, even if possible, it 
would be far from pure OO and far from intuitive.)

> If closure is nested within another closure, is the idea to only support 
> return from the outermost scope (method)?

Presumed it is intended as a loose equivalent of a return inside a for loop, it 
probably should, precisely like return in a nested loop does.

> You could experiemnt with Groovy Macro to replace any "expr.each { ... }" 
> with some other expression.  This can typically be done more quickly than an 
> AST transform.  It may not be the final form of your solution, but does let 
> you try things quickly.

My intention was primarily to open a debate whether such a thing would be worth 
to add to Groovy or not, regardless the particular implementation (perhaps I 
should not have added the exception-based example at all).

Thanks and all the best,
OC

> 
> From: OCsite <o...@ocs.cz>
> Sent: Wednesday, December 4, 2024 11:03 AM
> To: dev@groovy.apache.org <dev@groovy.apache.org>
> Subject: [EXT] for loops, returns, and other animals
>  
> External Email: Use caution with links and attachments.
> 
> MG,
> 
> On 4. 12. 2024, at 16:11, MG <mg...@arscreat.com> wrote:
> e.g. using a for(foo : foos) { ... } loop instead of canonical Groovy 
> foos.each { foo -> ... }, to be able to easily return from the for body from 
> multiple places using return statements.
> For one, I would argue that the native and groovier (since more logical and 
> intuitive and intention-revealing for anyone who can read English completely 
> regardless whether he knows Java or not) variant should be the for/in loop, 
> like for (foo in foos). That weird and unintuitive colon thing should, in my 
> personal opinion, remain limited to code copy/pasted from Java (exactly like 
> var :))
> 
> That would not be worth an extra email though. I wonder, would it be perhaps 
> worth the effort to extend the language by adding a support for 
> method-returning from a closure?
> 
> A trivial (and most probably very very wrong and problems-inducing!) approach 
> might perhaps be an ASTT which would convert code like
> 
> def foo() {
>   bar.each { if (it) methodreturn it }
> }
> 
> to something like
> 
> def foo() {
>   try {
>     bar.each { if (it) throw new MethodReturnException(value:it) }
>   } catch (MethodReturnException e) {
>     return e.value
>   }
> }
> 
> Would it be perhaps worth the effort to add such an ASTT to Groovy? Not sure 
> at all... but it might help (a) to stick with the canonical foo.each instead 
> of enforcing for/ins, (b) also, in many cases like foo.find, foo.allResults, 
> et cetera, which are even more ugly to replace with plain ole loops.
> 
> All the best,
> OC
> 

Reply via email to