In the new D release why use free functions instead of properties?

Gary Willoughby via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Aug 19 09:04:13 PDT 2014


On Tuesday, 19 August 2014 at 00:55:24 UTC, Idan Arye wrote:
> On Tuesday, 19 August 2014 at 00:54:25 UTC, Idan Arye wrote:
>> On Monday, 18 August 2014 at 21:17:11 UTC, Jonathan M Davis 
>> wrote:
>>> On Monday, 18 August 2014 at 21:02:09 UTC, Gary Willoughby 
>>> wrote:
>>>> In the new D release there have been some changes regarding 
>>>> built-in types.
>>>>
>>>> http://dlang.org/changelog.html?2.066#array_and_aa_changes
>>>>
>>>> I would like to learn why this has been done like this and 
>>>> why it is desired to be free functions rather than 
>>>> properties?
>>>
>>> Probably because they never should have been properties in 
>>> the first place. Properties are supposed to emulate 
>>> variables, whereas something like dup is clearly an action. 
>>> So, it's clearly not supposed to be a property. However, 
>>> because D doesn't require parens on a function with no 
>>> arguments, you can still call it without parens. Some of the 
>>> changes probably also help with cleaning up the AA internals, 
>>> which is sorely needed.
>>>
>>> - Jonathan M Davis
>>
>> Also std.algorithm's heavy usage of passing delegates as 
>> template arguments makes it more elegant to use free functions:
>>
>>    import std.algorithm;
>>    import std.compiler;
>>
>>    void main()
>>    {
>>        int[][] arr=[[1,2],[3,4]];
>>        static if (version_minor<=65){
>>            auto arr2=arr.map!(a => a.dup)();
>>        }else{
>>            auto arr2=arr.map!(a.dup)();
>>        }
>>        arr2[0][0]=9;
>>        assert(arr2[0][0] == 1);
>>    }
>
> Sorry - that should have been:
>
>      import std.algorithm;
>      import std.compiler;
>
>      void main()
>      {
>          int[][] arr=[[1,2],[3,4]];
>          static if (version_minor<=65){
>              auto arr2=arr.map!(a => a.dup)();
>          }else{
>              auto arr2=arr.map!(dup)();
>          }
>          arr2[0][0]=9;
>          assert(arr2[0][0] == 1);
>      }

This kind of makes sense for `dup` because that could be applied 
across types but what about rehash, byKey, byValue, keys, values, 
etc of AA's? Surely these will only be used by AA's? Is this more 
about speed optimisation?


More information about the Digitalmars-d-learn mailing list