Michel Fortin wrote:
I hope this proposal can rally more that divide... let's see.
Andrei said this in another thread about adding a property keyword in
front of functions to make them properties:
The problem is that it's all loss, no gain: the callee must make the
decision whether the call must be with or without parens, and the caller
must obey that decision. There is no guarantee gained, only effort.
I see your point Andrei: it's little gain to add a syntax that's just a
modifier to a function to decide how you must call it.
That's a great summary.
I also see the point of all those arguing that it's important to be able
to distinguish between a property and an action, and that the english
laguage is not expressive enough to make that distinction clear in a lot
of cases.
I understand that point too.
I know, I've written programming guidelines[1] and tried very
hard to make this problem go away by mandating "is", "has" or a modal
verb as a prefix for boolean attributes in the guidelines, only to be
stuck with no solution for the "transform" example from Bill Baxter
(thread "Properties - another one that gets me") which isn't boolean and
for which you can't really add a prefix that makes sense.
[1]: http://prowiki.org/wiki4d/wiki.cgi?DProgrammingGuidelines
Good point.
The best simple solution to that property problem I've seen up to now is
to define "getProperty" and "setProperty" and have the compiler
automatically check for these functions when it encounters the
"property" symbol.
Why do I favor "getThing" and "setThing" over "opGet_thing" and
"opSet_thing"? Because the later are ugly. Please don't underestimate
aestetics and readability as those are the key to make the language
enjoyable to use and what the beginners will judge the language from.
Also, the pattern will be pretty familiar to those comming from Java and
elsewhere. And finally, for those who don't like having a property
syntax, they can ignore properties completely and continue to use the
get/set functions directly without making their code ugly.
I also like getThing and setThing more than get_thing and set_thing for
defining a property called "thing". They both have problems, though: the
former can't define a property starting with an uppercase letter, and
the latter can't define a property starting with an underscore. (Symbols
can't contain two underscores.) Ideas?
Here's an example:
~~~
int getValue();
void setValue(int x);
setValue(1); /* property: */ value = 1;
assert(getValue() == 1); /* property: */ assert(value == 1);
~~~
The problems this syntax should fix are:
1. the ambiguity between actions and properties: getValue()/setValue()
are functions and thus actions named with verbs ("get" and "set"), but
you can access them as the "value" property too, which is a noun that
will call the function as necessary when an action is needed. (As a
bonus, this makes "writeln = 2" illegal.)
Cool. If I only defined getEmpty, to I get to still use empty?
2. the inconsistency for functions and properties returning something
such as a delegate or a struct or class with an opCall member, where you
absolutely need to write the function with a parenthesis to actually
call the returned value. You can either call the function
"getMyDelegate()(delegate_arg)" or use the property
"myDelegate(delegate_arg)" just as you can with a field.
Very nice solution indeed.
This syntax doesn't solve the operator overloading issue. It isn't meant
to do that either: properties should stay simple.
Which issue are you referring to? +=?
The two small problems it pose are:
1. There's an ambiguity when another symbol is named after the property
name that would call the get/set function. I suggest that this other
symbol simply hide the property.
I wonder what should happen when this happens across scopes, e.g. in
base and derived classes.
2. You need an uppercase algorithm in the compiler to be able to
translate "property" to "setProperty" and "getProperty" and do the
proper lookup. This works well for ASCII, but can it go messy with Unicode?
Good question.
To avoid converting to unicode upercase, we could use "get_thing" and
"set_thing" (nicer than opGet/opSet), although that doesn't really fit
with the coding standards of D.
Also, again, if you want to define "_thing" you'd have to write
"get__thing" and "set__thing". Maybe we could lift the restriction about
two underscores and only keep it for two leading underscores.
Andrei