In every language I've seen that has "properties" (C#, Python), they are:

    - _Defined_ like methods
    - _Used_ like variables

The trouble is, this isn't true with D.

Consider:

struct Struct
{
    int delegate() randgen1 = ...;
    @property
    int delegate() randgen2() { ... }
}

Struct s;
auto result = s.randgen2();    // This doesn't do the user expects

It is *not* possible, in D, to transparently use either one -- you have to treat properties, like methods, not like variables. Except that this is inconsistent -- in most other cases, you don't need to do that.

Or for example:

Struct s;
auto a = &s.randgen1;
auto b = &s.randgen2;  // Should be an error

IMO, properties should not be callable with parentheses at all. Something like C# -- they should generate getter and setter methods instead, or the like. Furthermore, taking the address of a property should only work if you can take the address of its _value_. If you need the address of the actual function, then I think a corresponding getter method might be easier to use.

It gets even /worse/ in templated code, because you have no idea whether an alias is referring to a property or to a variable or whatever.

Making this change would obviously break code, but the break is obviously _trivial_ to fix: just remove extra parentheses. It won't exactly be the kind of breakage that causes headaches.

So should this be fixed?

Reply via email to