> Thinking about it, this becomes something more like a "with" keyword
I was starting to think along these lines.
I do like the idea of being able to specify the context for a block -
though, as you say, this feature raises issues, and in e.g.
Javascript, these days, it is now strongly discouraged, and prevented
in strict mode.
I do think it would have some potentially pretty awesome uses though -
for example, in templates, assuming this statement would have a
non-block counterpart (like if and while have) you could "import" a
class with HTML helper methods in this way:
<?php with ($html_helper): ?>
<h1><?= escape($title) ?></h1>
<?php endwith ?>
It also potentially lets you create highly convenient DSLs:
with ($parser_helper) {
$INT = seq(optional(char("-")), plus(digit()));
}
This would have potentially really good IDE support and offline
inspections as well.
I guess the biggest issue is what happens when you wrap multiple scopes?
with ($a) {
with ($b) {
foo();
}
}
What happens in this case? I don't think there's any good answer to
that question - if neither $b or $a implements foo(), the only thing
the compiler could do, is dispatch $b->__call("foo", []) ... so you'd
need some really complex logic and rules, and these constructs could
have some pretty unpredictable performance implications as well.
There's also the question of what happens in this case:
with ($a) {
bar();
}
function bar() {
with ($b) {
fud();
}
}
Does it work in the local scope only, or would it be able to resolve
as $a->fud() ? That's crazy, and it probably should work only in the
lexical scope of the current function, but anyways - I think this
feature raises a lot of ugly questions with no elegant answers...
On Tue, Jul 12, 2016 at 10:36 AM, Rowan Collins <[email protected]> wrote:
> On 12/07/2016 00:14, Jesse Schalken wrote:
>>
>> If so, some consideration should be made as to which syntax is preferred
>> to solve this problem generally for both setting properties and calling
>> methods.
>>
>> I prefer the "obj { .. }" syntax because it mirrors object literals in
>> JSON/JavaScript, object initializers in C# and C/C++ and Haskell record
>> syntax, is particularly concise when nested to create large trees of
>> objects, and avoids the noise of "->>" on each line.
>
>
> All the examples you've given for that syntax are for initialisation, and
> I'm not sure how readable it would be for the general "do several things in
> a row" case:
>
> $counter {
> count(),
> count(),
> count(),
> count()
> }
>
> Thinking about it, this becomes something more like a "with" keyword:
>
> with ( $counter ) {
> count();
> count();
> count();
> count();
> }
>
> If with(){} could be used as an expression, you'd get something remarkably
> close to your initialiser example:
>
> $this->setBlah(
> with ( Blah::create(4) ) {
> foo = $foo;
> baz = with ( new Baz() ) {
> markFixed();
> label = "Hello";
> };
> setBot(9);
> }
> );
>
> I'm not sure if this is a good thing or not - with() statements exist in a
> few languages, with varying degrees of acceptance. I don't remember seeing
> one used as an expression like that before, though.
>
> There's a definite awkwardness of what to put on the left side of property
> assignments too...
>
> with ( new Foo ) { var = 1 }
> with ( new Foo ) { $var = 1 }
> with ( new Foo ) { ->var = 1 }
>
>
> Overall, it's an interesting idea, but the details are fiddly, and the gains
> marginal, IMO.
>
>
> Regards,
> --
> Rowan Collins
> [IMSoP]
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php