On 17 December 2025 19:59:54 GMT, "Tim Düsterhus" <[email protected]> wrote:

>    let (
>        $scoped = new Scoped(),
>        $scoped,
>    ) {


My attempts to guess what this would do went something like this: 

1) The second mention of $scoped does nothing, you've already declared it as 
scoped to this block

2) That seems trivial for the compiler to spot, so probably an Error

3) Maybe it overwrites the variable to null? But that would make the lifetime 
shorter, not longer

4) So, somehow, there are two variables, with the same name, and they both live 
until the end of the block?

5) Wait, does that mean this is just a sequence of declaration statements in 
disguise?


It feels like this completely goes against everything you've been saying about 
avoiding the ambiguity of ALGOL-style declarations.

If you can do that, presumably you can do this: 

let(
     $foo = bar($baz), // What is $baz referring to? Particularly if it is a 
by-reference out parameter.
     $baz = 1,
 )

Which is a direct translation of an example you gave here: 
<https://externals.io/message/129059#129583>

Thinking about it, even the dynamic coding features of PHP you say would be so 
difficult aren't automatically prohibited: 

let(
    $foo = compact('bar'),
    $bar = extract($foo),
)
     
and so on. 


I kind of hope I'm misunderstanding something here, because this feels like a 
pretty big hole in the premise.



Rowan Tommins
[IMSoP]

Reply via email to