Reddit: why aren't people using D?

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Mon Jul 27 09:16:59 PDT 2009


Steven Schveighoffer wrote:
> On Mon, 27 Jul 2009 10:54:00 -0400, Andrei Alexandrescu 
> <SeeWebsiteForEmail at erdani.org> wrote:
> 
>>
>>> That's why properties are not
>>> functions.
>>
>> This post had a negative effect on me: I now think properties are 
>> functions even more than before.
> 
> Let me bring you back to the issue at hand:
> 
> writefln = "hi";
> 
> :)

That wart must be eliminated. But the shortcomings of the current design 
are not a proof that we need a specialized facility for what is at the 
end of the day nothing but a notational convenience.

> properties are *implemented* using functions, but both properties and 
> function usage should be restricted to disallow bizare code.

I agree.

> Another example:
> 
> I've brought up this example before, but I'll summarize the issue.  I 
> created a TimeSpan struct for Tango, which represents a span of time.  I 
> had static functions to create time spans, and properties to convert 
> time spans.  For example:
> 
> struct TimeSpan
> {
>   static TimeSpan seconds(long n); // returns a TimeSpan representing n 
> seconds
> 
>   ...
> 
>   long seconds(); // convert this timespan to seconds
> }
> 
> So you use it like this:
> 
> auto ts = TimeSpan.seconds(5);
> assert ts.seconds == 5;
> 
> But then I got a bug report one day that this assert fails:
> 
> auto ts = TimeSpan.seconds(5);
> ts.seconds = 4;
> assert(ts.seconds == 4);
> 
> What the second line does is create a temporary TimeSpan of 4 seconds, 
> and throw it away.
> 
> What happened here?  Why did the compiler compile this code at all?  
> Well, because I can't tell the compiler "no, that static seconds 
> function is *not* a property", someone tried to use it as one, and then 
> complained it didn't work like it should.  Would anyone reading the 
> second line of code, knowing it compiles, *not* think "aha! TimeSpan has 
> a way to set it's seconds component"?
> 
> The "solution" was to rename the static function to fromSeconds, 
> although this is still valid code:
> 
> ts.fromSeconds = 4;
> 
> it doesn't look like it means anything (what's this fromSeconds 
> field?).  But WTF?  Why do I have to do this kind of shit instead of 
> just telling the compiler "this is how you use my object.  Any other 
> uses are invalid.  End of discussion".
> 
> For reference: http://www.dsource.org/projects/tango/ticket/1184

I agree that that's a wart too that needs to be removed.


Andrei



More information about the Digitalmars-d mailing list