Call site 'ref'

Peter Alexander peter.alexander.au at gmail.com
Sun Jan 15 07:47:44 PST 2012


On 15/01/12 3:19 PM, dsimcha wrote:
> On 1/15/2012 8:36 AM, Alex Rønne Petersen wrote:
>> Hi,
>>
>> I don't know how many times I've made the mistake of passing a local
>> variable to a function which takes a 'ref' parameter. Suddenly, local
>> variables/fields are just mutating out of nowhere, because it's not at
>> all obvious that a function you're calling is taking a 'ref' parameter.
>> This is particularly true for std.utf.decode().
>>
>> Yes, I realize I could look at the function declaration. Yes, I could
>> read the docs too. But that doesn't prevent me from forgetting that a
>> function takes a 'ref' parameter, and then doing the mistake again. The
>> damage is done, and the time is wasted.
>>
>> I think D should allow 'ref' on call sites to prevent these mistakes.
>> For example:
>>
>> string str = ...;
>> size_t pos;
>> auto chr = std.utf.decode(str, ref pos);
>>
>> Now it's much more obvious that the parameter is passed by reference and
>> is going to be mutated.
>>
>> Ideally, this would not be optional, but rather *required*, but I
>> realize that such a change would break a *lot* of code, so that's
>> probably not a good idea.
>>
>> Thoughts?
>>
>
> This would break UFCS severely. The following would no longer work:
>
> auto arr = [1, 2, 3, 4, 5];
> arr.popFront(); // popFront takes arr by ref

Unless it was ignored for UFCS, which is reasonable, since foo.bar() 
looks like it could modify foo whereas bar(foo) doesn't in general.


More information about the Digitalmars-d mailing list