Why are there Properties in D?

Robin robbepop at web.de
Sat Feb 15 07:45:39 PST 2014


On Friday, 14 February 2014 at 19:24:58 UTC, Marc Schütz wrote:
> On Friday, 14 February 2014 at 16:16:28 UTC, Robin wrote:
>> On Friday, 14 February 2014 at 15:21:04 UTC, Jesse Phillips 
>> wrote:
>>> FYI an infinite range is defined to have
>>>
>>>   struct Infinite {
>>>       enum empty = false;
>>>   }
>>>
>>> You know it will never be empty at compile time.
>>
>> Hiho,
>>
>> thank you for this interesting input. =)
>>
>> Couldn't this be equally possible (also at runtime) with the 
>> following:
>>
>> struct Infinite {
>>    enum empty_ = false;
>>    bool empty() pure { return empty_; }
>> }
>
> Yes, but only at runtime. For some things to work, you need to 
> be able to know it at compile time. `std.range` defines a 
> template `isInfinite` that checks for this.
>
> This information can be used for some optimizations: 
> `std.algorithm.count` and `std.range.walkLength` are only 
> defined for non-infinite ranges (to avoid creating an infinite 
> loop), `std.algorithm.cartesianProduct` can work with two 
> infinite ranges using a special enumeration strategy if it can 
> detect them, `std.range.chain` can optimize index access by 
> stopping at the first infinite range, `std.range.take` can 
> always define a length for infinite ranges (even if they don't 
> have a length property themselves), ...
>
> Another example: The `length` property of ranges. It is 
> possible to turn builtin slices (dynamic arrays) into ranges by 
> importing `std.range` or `std.array`. Slices already have a 
> member field `length` by default. Here you have an example 
> where it's impossible to define a method `length()`. With 
> properties, nothing special needs to be done: You can always 
> use `length` without parens, even if it happens to be a method.

Uhm, ... I thought that enum types for variables are determined
at compiletime and as pure functions aren't affected by
side-effects and cause no side-effects their result should be
determinable at compiletime, too.

Couldn't it be possible again if we just add another getter
method "length()" for the slice's length? Then you would have a
uniform access as length() instead of length (without parens) if
you do it analogiously for all other cases. There is just no
difference in my opinion - the one solution forces an interface
with parens and the other forces an interface without them.

Robin


More information about the Digitalmars-d mailing list