@property - take it behind the woodshed and shoot it?

luka8088 luka8088 at owave.net
Fri Jan 25 03:38:02 PST 2013


On 24.1.2013 23:04, Andrei Alexandrescu wrote:
> On 1/24/13 4:56 PM, Adam Wilson wrote:
>>> Simplicity is clearly good, but there's something to be said about
>>> those warts in chained calls. The UFCS-enabled idioms clearly bring a
>>> strong argument to the table, there's no ignoring it.
>>>
>>> Andrei
>>
>> Then @property needs to be fixed such that optional parens don't effect
>> it one way or the other. Removing the concept of properties and making
>> functions that look like properties through optional parens is a very
>> poor (and lazy) solution. As Mr. Ruppe pointed out, properties are DATA,
>> and functions do stuff. That statement alone is an excellent argument
>> for clearly delineating which is which... Properties are not functions.
>
> I'm not all that convinced, and it's easy to get wedged into a black vs
> white position that neglects many subtleties. Properties are DATA, well
> except when you need to pass fields by reference etc. at which point the
> syntactic glue comes unglued.
>
> There's been a lot of strong positions years ago about functions vs.
> procedures, statements vs. expressions, or even (the glorious 60s!)
> in-language I/O primitives vs. I/O as library facilities. Successful
> languages managed to obviate such dichotomies.
>
>
> Andrei

Maybe this will clarify what is meant by "properties are data":


// http://dpaste.dzfl.pl/822aab11

auto foo () {
   return { return 0; };
}

@property auto bar () {
   return { return 0; };
}

void main () {
   auto localFoo = foo;
   assert(!is(typeof(localFoo) == typeof(foo)));
   auto localBar = bar;
   assert(is(typeof(localBar) == typeof(bar)));
}



function:
auto localFoo = foo; // call foo and store the result
typeof(localFoo) // typeof(data returned by foo) - function pointer
typeof(foo) // typeof(function foo) - function

data:
auto localBar = bar; // get data represented by bar
typeof(localBar) // typeof(data represented by bar) - function pointer
typeof(bar) // typeof(data represented by bar) - function pointer


Data represented by bar can be some value, or a function call that 
returns a value. As a user of that property I don't care. And I don't 
want my code to break if that property changes from a function pointer 
to a function that returns a function pointer. Hence typeof(foo) is a 
function, and typeof(bar) is a type of that property (type that is 
returned by a calling bar). I would like to emphasize that @property is 
not a syntactic, but rather a semantic issue.



More information about the Digitalmars-d mailing list