> > Generally, RFCs are for changes in the language itself, not for API contracts in C. That can generally be handled in PRs, if I understand correctly. >
I thought this was handled by PHP INTERNAL. So I have no idea how it actually works. > > or other weird shenanigans? I think it would be better as a statement. > Your example was absolutely convincing. I have nothing to argue with :) So, `suspend` is 100% an operator. > > What happens if it throws? Why does it return NULL; why not `void` or the result of the awaited spawn? > Exceptions are thrown if they exist. This also applies to `suspend`, by the way. Why not `void`? Because the expression `$result = await ...` must resolve to something. If I remember the core code correctly, the PHP engine returns `NULL` even if the function is declared as `void`. > > Wouldn't it be better to throw an exception instead of silently failing? > Possibly, yes. For me, this is a difficult situation because the code inside the final handler is already executing in a context where any exception can interrupt it. > > Hmm. Do you mean this literally? So if I call a random function via spawn, it will have access to my current scope? > Exactly. And yes, accessing a `Scope` defined in a different context is like shooting yourself in the foot. That's why this possibility should be removed. > > I know I have been critical in this email, but I actually like it; for the most part. I think there are still some rough edges to sand down and polish, but it is on the right track! > In this RFC, I made two very big mistakes due to attention distortion. This once again proves that it should be moved forward very slowly, as it only seems simple. The first major mistake was that I tried to make functions an element of structural concurrency. But to do so, functions would need to have an `async` attribute, which contradicts the RFC. The second mistake is the `currentScope()` function, which doesn't just shoot you in the foot—it shoots you straight in the head (just like `globalScope()`). Of course, a programmer can intentionally pass the `$scope` object to another coroutine, but making it easier for them to do so is madness.