Hi John,

On 05/05/2020 18:27, John Bafford wrote:
I very much do like the idea of named parameters, but I do not like the 
specific proposal in the linked RFC at all. I think that treating named 
parameters simply as syntactic sugar is not a good approach. If we're going to 
add named parameters, I think they should actually be significant in their own 
right. As such, please allow me to present an alternative.

I would propose the following opt-in mechanism, which would work by treating 
the parameter names as*part of the function name*. Doing it this way I_think_  
should allow for no backwards compatibility issues with existing code and would 
especially give library authors full control over the naming and presentation 
of their APIs.


I really like *some* of this proposal, but I think some of it is solving a different problem.


You mention in a later e-mail that you've been heavily inspired by Swift; Swift in turn was inspired by Objective C, which was inspired by Smalltalk. This is an important piece of history, because Smalltalk doesn't actually have methods with named parameters; it has "keyword messages" whose "selectors" are things like "indexOf:startingAt:". Swift makes them look more familiar by keeping part of the name separate from what it calls "argument labels", so a method might be called "indexOf(_:startingAt:)" or "index(of:startingAt:)".

Although at a glance these look like named parameters, and they solve some of the same problems, they're actually a fundamentally different concept.

They have some nice features:

* Method calls can be made to read like sentences
* The external API of the function is kept separate from the internal implementation
* You can skip over default arguments by omitting their labels
* Overloading what looks like one method, by having different methods whose names start the same but have different "argument labels", may be appealing

But there are some crucial limitations:

* You can't call a method without using its labels; you'd need to have a separate method with a similar name and no labels * Similarly, it's up to the method's author to have versions with a mixture of unlabelled and labelled parameters, so a call like "create('hello', 42, locked: true)" is only possible if that specific variant is defined * You can't use the labels in the "wrong" order, you have to know the order they come in; so it doesn't solve the haystack/needle problem, except by creating extra function definitions * Similarly, methods with large numbers of arguments are still hard to use because you need to know both the name *and* the relative position of the arguments you're providing (imagine defining variants with every order of the 5 bit flags in the AMQP example in my earlier e-mail)


It would be possible to take the "outside name is different from inside name" concept and apply it to named parameters proper. But the problems I would like to solve with named parameters wouldn't be solved by Swift/Smalltalk style functions.


Regards,

--
Rowan Tommins (né Collins)
[IMSoP]

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to