Re: PHP True Async RFC - Stage 2

From: Date: Wed, 19 Mar 2025 13:43:56 +0000
Subject: Re: PHP True Async RFC - Stage 2
References: 1 2 3 4 5 6 7 8 9  Groups: php.internals 
Request: Send a blank email to [email protected] to get a copy of this message


On 19 March 2025 11:27:11 GMT, Edmond Dantes <[email protected]> wrote:
>>
>> You're cheating again - you've put an extra pair of brackets around one
>> expression and not the other, and assumed they'll work differently, but
>that's
>> not the grammar you proposed.
>>
>
>Why am I cheating?

"Cheating" in the sense that you wrote out a "general syntax", and then dropped
in examples that contradicted that syntax. Saying "it follows this grammar, except when it
doesn't" isn't very enlightening.



>> spawn (getClosure());
>This is an honest statement, provided that the second parentheses are
>optional. The full notation would be:
>> spawn (getClosure())();

That's not the problem; the problem is that the following are all equivalent expressions:

foo()
(foo())
((foo()))
(((foo())))

But you want these to mean different things: 

spawn foo();
spawn (foo());

I think that would be achievable with a new grammar rule for "expression other than function
call", so you could have: 

spawn_statement:
    'spawn' function_call { compile_function_spawn }
    | 'spawn' expression_not_function_call { compile_closure_spawn }

But from a user's point of view, I hate rules like that which mean subtle changes completely
change the meaning of the code, in a very specific context.


>The reverse meaning is that if spawn is not followed by the function
>keyword, then it must be a valid expression that can be enclosed in
>parentheses.
>
>There are some doubts about whether all situations are correct, but so far,
>this is how it works for me:


All of these are examples of the keyword being followed by *a function call*, not *any expression*.
Which honestly I think is the right way to go.

The "expression" part came into the conversation because I think it's weird to force
the user to write "function() { ... }" as though it's a Closure declaration, but not
let them perform obvious refactoring like moving that declaration into a variable. 

If it's going to be a special case for an "inline coroutine", just use a keyword
other than "function", so it doesn't look like an expression when it's not, like
"spawn block { ... }"; or no keyword at all, just "spawn { ... }"


Rowan Tommins
[IMSoP]


Thread (59 messages)

« previous php.internals (#126841) next »