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

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

Never the less, the need to include 5+ variables in your closure -
code smell? I stated above that command pattern and data-transfer
objects are probably better, and that's why I think the example in the
RFC is not motivating enough.

The question is not "what do I want to be able to write", but rather
"what do I want to be forced to read [by less qualified programmers]".

> For some people, shorter makes it more readable because there is less to
> read and more whitespace surrounding it. Ironically readability is why I
> prefer fn() w/autocapture over "function(...) use (...) {...}."
>
> Also, it appears you may be discounting that readablity evolves as people's
> familiarity with a new syntax increases.  For example, I found RegEx
> completely unreadable for a long time, but today I find them completely
> readable because I now understand them. Have you already considered whether
> or not you would still find fn() w/autocapture less readable even after you
> have more time and experience seeing it in other people's code, and decided
> that you would still find it less readable?
>
> I do recognize that ever developer has their own preference and I am sensing
> that your preference is for more verbose syntax, at least in this case? If
> that is true shouldn't you just state that more verbose is your preference
> and if you have a vote then vote against the RFC? Isn't it unfair to
> implictly assert that "shorter is less readable" when really it is just a
> preference?
>
> -Mike

See above. (I have no voting power.)

Olle

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to