2021-03-26 17:11 GMT+01:00, Mike Schinkel <m...@newclarity.net>: >> On Mar 26, 2021, at 8:12 AM, Olle Härstedt <olleharst...@gmail.com> >> wrote: >> >> 2021-03-26 3:38 GMT+01:00, Mike Schinkel <m...@newclarity.net>: >>> >>> >>>> On Mar 25, 2021, at 4:09 PM, Olle Härstedt <olleharst...@gmail.com> >>>> wrote: >>>> >>>> 2021-03-25 17:49 GMT+01:00, Mike Schinkel <m...@newclarity.net>: >>>>>> On Mar 25, 2021, at 11:22 AM, Olle Härstedt <olleharst...@gmail.com> >>>>>> wrote: >>>>>> >>>>>> 2021-03-25 16:02 GMT+01:00, Mike Schinkel <m...@newclarity.net>: >>>>>>> >>>>>>> >>>>>>>> On Mar 25, 2021, at 10:41 AM, Rowan Tommins >>>>>>>> <rowan.coll...@gmail.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>> On 25/03/2021 12:31, Nuno Maduro wrote: >>>>>>>> >>>>>>>>> The reason why we believe the vast majority of PHP Developers are >>>>>>>>> going >>>>>>>>> to >>>>>>>>> appreciate this RFC is because multi-line short closures (aka >>>>>>>>> Auto-capturing multi-statement closures) *are more simple, shorter >>>>>>>>> to >>>>>>>>> write, and prettier to read *— and the community love these >>>>>>>>> changes >>>>>>>>> as >>>>>>>>> proven on "property promotions", "one-line short closures", etc. >>>>>>>> >>>>>>>> >>>>>>>> My main point was that the RFC needs to spell out this argument, >>>>>>>> rather >>>>>>>> than taking it for granted that everyone agrees on "those >>>>>>>> situations >>>>>>>> where >>>>>>>> that is warranted". >>>>>>>> >>>>>>>> Most of the current text should be summarised in a "syntax choices" >>>>>>>> section somewhere near the end. I would like to see much more space >>>>>>>> devoted to: >>>>>>>> >>>>>>>> * Why we need this feature. What has changed since it was left out >>>>>>>> of >>>>>>>> the >>>>>>>> arrow functions RFC? What problems is it addressing? Why do you >>>>>>>> think >>>>>>>> it >>>>>>>> is the best approach to those problems? >>>>>>>> * The exact semantics proposed: How will the variables to be >>>>>>>> captured >>>>>>>> be >>>>>>>> determined? Will it distinguish variables which are written before >>>>>>>> they're >>>>>>>> read, and if so how is that defined? Can auto-capturing closures be >>>>>>>> nested, i.e. will "fn() { return fn() { echo $a; } }" capture $a >>>>>>>> from >>>>>>>> the >>>>>>>> outermost scope? And so on... >>>>>>>> >>>>>>>> >>>>>>>>> Besides, one advantage of this RFC is that it is consistent with >>>>>>>>> the >>>>>>>>> current syntax of the language and with the short-functions >>>>>>>>> RFC[2]. >>>>>>>>> For >>>>>>>>> example, by proposing that "fn" keyword indicates a function will >>>>>>>>> auto-capture variables, by value. >>>>>>>> >>>>>>>> >>>>>>>> While it's a cute rationalisation, there's no intuitive reason why >>>>>>>> "fn" >>>>>>>> should have that meaning; we could pick any aspect of the current >>>>>>>> arrow >>>>>>>> function syntax and say "the 'fn' keyword means that". >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> On the other hand "use (*)" has no usages / or current meaning in >>>>>>>>> the >>>>>>>>> language. >>>>>>>> >>>>>>>> >>>>>>>> This is a straw man argument. I could equally say that "fn() { } >>>>>>>> has >>>>>>>> no >>>>>>>> usages or current meaning in the language" - of course it doesn't, >>>>>>>> we >>>>>>>> haven't added it yet! >>>>>>>> >>>>>>>> The "function use() {}" part of "function use(*) {}" has a >>>>>>>> well-established meaning, and "*" to mean "everything" is a >>>>>>>> notation >>>>>>>> developers are likely to be very familiar with. >>>>>>>> >>>>>>>> The two disadvantages I see with using "fn" as proposed are: >>>>>>>> >>>>>>>> * Because it's shorter, people will decide it's the "better" >>>>>>>> version, >>>>>>>> when >>>>>>>> they don't actually need any variable capture. An explicit syntax >>>>>>>> like >>>>>>>> "use(*)" instead makes this a deliberate choice. >>>>>>> >>>>>>> And yet adding " use (*)" makes the syntax longer, which goes >>>>>>> against >>>>>>> one >>>>>>> of >>>>>>> the goals many people have for it: to be shorter. >>>>>> >>>>>> I don't understand why this is a target in the first place. Shorter >>>>>> does not mean more readable, and readable is more important than >>>>>> writable. >>>>> >>>>> I agree that readable is more important than writable, but shorter >>>>> also >>>>> does >>>>> not necessarily mean it is *less* readable, either. >>>> >>>> Sure. The brain removes noise and reads in "symbols" anyway (where >>>> "fn" or "function" is a symbol of size 1). >>> >>> That is actually not exactly true, at least not in all cases. >>> >>> When "nction" combined with " use (.....)" adds to line length such that >>> a >>> developer must scroll horizontally to see all the text then it is not >>> the >>> same. >>> >>> And this is not a hypothetical for those of us who frequently use >>> vertical >>> split screen in our editors — I am constantly battling with lines that >>> are >>> too long. >>> >>> Also when longer lines cause code to wrap on GitHub or in blog posts or >>> other places then it is not the same. >>> >>>> A more important aspect of readability is the cognitive load on >>>> short-term memory, or how many "chunks" the programmer has to keep in >>>> memory to understand a piece of code. In this case, I think >>>> immutability and local scope helps a lot, of which PHP has neither. Or >>>> maybe predictability of the scope? All language quirks hurt >>>> readability. I never had a problem with scope in JS, despite it >>>> lacking immutability and only recently got proper block scope. >>> >>> Given that the RFC prescribes by-value capture and not by-ref capture how >>> it >>> is really even a problem? Or are you arguing that you fear people will >>> just >>> write closures hundreds of lines long? >>> >>> Maybe PHP should deprecate functions longer than 50 or 100 lines? >>> <rhetorical question> >>> >>>> Maybe more important than explicit/implicit capturing of scope is to >>>> keep your functions short...? In our legacy code-base, we have >>>> functions >>>> thousands of lines long. I can see auto-capturing being a problem >>>> there, but that's because of the technical debt and not the feature >>>> itself, I guess. Will our juniors realize that, tho? >>> >>> Now here is where I think the real problem is, the fact that other >>> developers write functions thousands of lines long. >>> >>> But realistically, legacy code won't be affected as people are rarely if >>> ever going to go back to your legacy code and convert a thousand line >>> function into a closure with auto-capture. >> >> No, I'm more concerned that someone will add a closer at the *bottom* >> of a long-ass function, capturing all variables, and then not have a >> properly defined lifetime, causing a memory leak or "spooky action at >> a distance" with object references. In other words, could it be a >> foot-gun? Maybe far-fetched, I don't know. > > Unless I misunderstand the RFC, the closure would only auto-capture the > variables that are specifically referenced inside the closure, so I don't > see it capturing *all* variables unless the developer intended it to by > referencing each one of them explicitly. > > And since the RFC captures the variables by-value I don't see how > auto-capture would be any different than using "use (...)," even with > objects.
Oh yeah, good point. My argument is moot. Olle -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php