Jump to page: 1 2
Thread overview
Allow empty field function arguments for default?
Apr 19, 2012
ixid
Apr 19, 2012
ixid
Apr 19, 2012
Jacob Carlborg
Apr 19, 2012
Jacob Carlborg
Apr 19, 2012
Jakob Ovrum
Apr 20, 2012
Christophe
Apr 20, 2012
Jacob Carlborg
Apr 20, 2012
Jakob Ovrum
Apr 23, 2012
Christophe
Apr 23, 2012
Jacob Carlborg
Apr 20, 2012
Jakob Ovrum
Apr 20, 2012
bearophile
April 19, 2012
I put this here because it's probably a flawed idea. A 'learn' level suggestion.

At present function arguments that you want to default must go at the end like so:

int fun(int a = 1, int b = 2, int c = 3)
{
    return a + b + c;
}

fun(4); //Modifies a

where the default fields can only be fields after any argument provided. Why not allow something like:

fun( , 4, ); //Modifies b
fun( , , 5); //Modifies c

for when you want to call fun with other fields not being default? This would seem more flexible and pretty clear what is intended.
April 19, 2012
And while I think about it why not allow the following to make b and c int rather than have to redeclare the type each time?

int fun(int a = 1, b = 2, c = 3)
{
    return a + b + c;
}
April 19, 2012
On 2012-04-19 16:13, ixid wrote:
> I put this here because it's probably a flawed idea. A 'learn' level
> suggestion.
>
> At present function arguments that you want to default must go at the
> end like so:
>
> int fun(int a = 1, int b = 2, int c = 3)
> {
> return a + b + c;
> }
>
> fun(4); //Modifies a
>
> where the default fields can only be fields after any argument provided.
> Why not allow something like:
>
> fun( , 4, ); //Modifies b
> fun( , , 5); //Modifies c
>
> for when you want to call fun with other fields not being default? This
> would seem more flexible and pretty clear what is intended.

Named arguments would probably be better for this.

fun(c = 5);

-- 
/Jacob Carlborg
April 19, 2012
On 2012-04-19 20:34, Jacob Carlborg wrote:
> On 2012-04-19 16:13, ixid wrote:
>> I put this here because it's probably a flawed idea. A 'learn' level
>> suggestion.
>>
>> At present function arguments that you want to default must go at the
>> end like so:
>>
>> int fun(int a = 1, int b = 2, int c = 3)
>> {
>> return a + b + c;
>> }
>>
>> fun(4); //Modifies a
>>
>> where the default fields can only be fields after any argument provided.
>> Why not allow something like:
>>
>> fun( , 4, ); //Modifies b
>> fun( , , 5); //Modifies c
>>
>> for when you want to call fun with other fields not being default? This
>> would seem more flexible and pretty clear what is intended.
>
> Named arguments would probably be better for this.
>
> fun(c = 5);
>

Which is actually possible to emulate:

callWithNamedArguments(fun, "c=5");

See:

https://github.com/jacob-carlborg/orange/blob/master/orange/util/Reflection.d#L135

-- 
/Jacob Carlborg
April 19, 2012
On Thursday, 19 April 2012 at 18:34:41 UTC, Jacob Carlborg wrote:
>
> Named arguments would probably be better for this.
>
> fun(c = 5);

Maybe so, but `fun(c = 5);` is not an additive change, while the OP's suggestion actually is.
April 20, 2012
"Jakob Ovrum" , dans le message (digitalmars.D.learn:34948), a écrit :
> On Thursday, 19 April 2012 at 18:34:41 UTC, Jacob Carlborg wrote:
>>
>> Named arguments would probably be better for this.
>>
>> fun(c = 5);
> 
> Maybe so, but `fun(c = 5);` is not an additive change, while the OP's suggestion actually is.

How about

int c;
fun(c = 5);

?

-- 
Christophe
April 20, 2012
On 2012-04-20 11:17, Christophe wrote:
> "Jakob Ovrum" , dans le message (digitalmars.D.learn:34948), a écrit :
>> On Thursday, 19 April 2012 at 18:34:41 UTC, Jacob Carlborg wrote:
>>>
>>> Named arguments would probably be better for this.
>>>
>>> fun(c = 5);
>>
>> Maybe so, but `fun(c = 5);` is not an additive change, while the
>> OP's suggestion actually is.
>
> How about
>
> int c;
> fun(c = 5);
>
> ?
>

I don't know. Default arguments would probably take precedence perhaps.

-- 
/Jacob Carlborg
April 20, 2012
On Friday, 20 April 2012 at 09:17:18 UTC, travert@phare.normalesup.org (Christophe) wrote:
> "Jakob Ovrum" , dans le message (digitalmars.D.learn:34948), a écrit :
>> On Thursday, 19 April 2012 at 18:34:41 UTC, Jacob Carlborg wrote:
>>>
>>> Named arguments would probably be better for this.
>>>
>>> fun(c = 5);
>> 
>> Maybe so, but `fun(c = 5);` is not an additive change, while the OP's suggestion actually is.
>
> How about
>
> int c;
> fun(c = 5);
>
> ?

That is what I was talking about. (did you mean to quote the post I quoted, perhaps?)
April 20, 2012
On Friday, 20 April 2012 at 11:09:30 UTC, Jacob Carlborg wrote:
> On 2012-04-20 11:17, Christophe wrote:
>> "Jakob Ovrum" , dans le message (digitalmars.D.learn:34948), a écrit :
>>> On Thursday, 19 April 2012 at 18:34:41 UTC, Jacob Carlborg wrote:
>>>>
>>>> Named arguments would probably be better for this.
>>>>
>>>> fun(c = 5);
>>>
>>> Maybe so, but `fun(c = 5);` is not an additive change, while the
>>> OP's suggestion actually is.
>>
>> How about
>>
>> int c;
>> fun(c = 5);
>>
>> ?
>>
>
> I don't know. Default arguments would probably take precedence perhaps.

That is exactly the problem though, it can silently change the behaviour of existing code. It is the worst kind of breaking change, hence I don't think it will ever be in D in this form, much less the current iteration of the language.
April 20, 2012
ixid:

> fun( , 4, ); //Modifies b
> fun( , , 5); //Modifies c
>
> for when you want to call fun with other fields not being default? This would seem more flexible and pretty clear what is intended.

I think that for the programmer's eye it's easy to miss one or more of those commas, when reading code. So to me something like this seems significantly less bug-prone:

fun(void, 4, void); // Modifies b
fun(void, void, 5); // Modifies c

Bye,
bearophile
« First   ‹ Prev
1 2