On Fri, Mar 15, 2019 at 4:16 PM Levi Morrison <le...@php.net> wrote:

> Personally, I think pass by-value with copy-on-write semantics like
> arrays is the sweet spot. Mutability is fine if it is localized.
>

If we introduce something like this, I think it is very important that it
does not use the same property access syntax as ordinary objects, which are
not copy-on-write. I do not want to be second guessing whether $x->y = $z
is going to copy or not. Possibly such struct types should indeed use the
array access syntax, because array access is generally copy-on-write (the
exception being ArrayAccess objects).


> I think having a no-constructor construction syntax is also a good
> idea. I've discussed it with a few people, but don't can't remember if
> it's ever been brought up on-list. Basically, the idea is to use a
> JSON-like syntax with the type-name in front, and I think it can be
> fine to use on regular classes that don't have a constructor too:
>
>     struct Point2d {
>       float $x;
>       float $y;
>     }
>
>     $origin = Point2D { x: 0, y: 0 };
>
> This syntax has no conflicts. We could also add an object literal
> syntax for creating ad-hoc stdClass objects like so: `$obj = { x: 1,
> y: 1}`. This has an ambiguity, but I believe I have solved the issue
> without too much trouble once before.
>

This syntax has no conflicts in the sense that the grammar is unambiguous,
but I believe it does conflict under LR(1). The problem is the alternative
array access syntax, which makes Point2D { x } currently valid syntax. We
can distinguish it at the ":", but by this point a shift/reduce descision
on "{" must have already been made. (We can likely hack around this.)

Nikita

Reply via email to