Call site 'ref'

Alex Rønne Petersen xtzgzorex at gmail.com
Sun Jan 15 09:43:50 PST 2012


On 15-01-2012 16:47, Peter Alexander wrote:
> 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.

Agreed.

--
- Alex


More information about the Digitalmars-d mailing list