On Tue, 10 Mar 2020 at 15:04, Mike Schinkel <m...@newclarity.net> wrote:

> > I think he meant return type declaration. That's why the question about
> > the `use` clause is as well relevant.
>


Yes, that was a typo on my part, sorry.



> But even so, the question is surprising because we have a well established
> existing pattern with extends and implements clauses, for example:
>
> function foo():returntype
>         extends Parent
>         implements Interface1, Interface2, Interface2
>         attributes Attribute1, Attribute2, Attribute3 {}
>
>

I'm not sure where you're going with that - as far as I know, extends and
implements are only valid on classes, and return types are only valid on
functions, so there'd never be a mixture in one declaration.

Still, you're right that it's perfectly resolvable, it's just an extra
consideration to throw into the mix.


I do think that particular syntax would get a bit messy with more involved
declarations, though:

public static function doSomething(Action $what, int $howManyTimes):
boolean attributes Memoize, Jit, Log(LogLevel::DEBUG), Autowire(1) {
    // ...
}

Maybe rules for whitespace would evolve to let that flow onto multiple
lines, but it's not quite clear how the indenting should look; like this
maybe?

public static function doSomething(Action $what, int $howManyTimes):
boolean
    attributes Memoize, Jit, Log(LogLevel::DEBUG), Autowire(1) {
    // ...
}


The current proposed syntax leaves the main declaration as it is now, and
visually separates the attributes at the expense of vertical whitespace:

<< Memoize>>
<<Jit>>
<<Log(LogLevel::DEBUG)>>
<<Autowire(1)>>
public static function doSomething(Action $what, int $howManyTimes):
boolean {
    // ...
}

A suggestion that's come up a couple of times is to allow grouping of
attributes, so you could flatten it onto one line:

<<Memoize, Jit, Log(LogLevel::DEBUG), Autowire(1)>>
public static function doSomething(Action $what, int $howManyTimes):
boolean {
    // ...
}

Or the attributes could be grouped according to some coding standard:

<<Memoize, Jit>>
<<Log(LogLevel::DEBUG), Autowire(1)>>
public static function doSomething(Action $what, int $howManyTimes):
boolean {
    // ...
}


There's plenty of other possibilities we could consider, though - again,
see the Python wiki link for a whole range of proposals they had for
decorators, and we may be able to find similar lists to learn from for
other languages.


Regards,
-- 
Rowan Tommins
[IMSoP]

Reply via email to