Uniform Function Call syntax for properties
Jonathan M Davis
jmdavisProg at gmx.com
Fri Oct 8 14:10:01 PDT 2010
On Friday, October 08, 2010 13:56:14 Nick Sabalausky wrote:
> "Steven Schveighoffer" <schveiguy at yahoo.com> wrote in message
> news:op.vj9cunrweav7ka at localhost.localdomain...
>
> > Someone was asking about UFC syntax for properties on d.learn, and I
> > realized, we have a huge ambiguity here.
> >
> > Given a function:
> >
> > @property int foo(int x)
> >
> > Is this a global setter or a getter on an int?
> >
> > i.e.
> >
> > int y = foo = 3;
> >
> > or
> >
> > int y = (3).foo;
> >
> > ???
> >
> > I know arrays have an issue with property setters, see a bug report I
> > filed a while back:
> >
> > http://d.puremagic.com/issues/show_bug.cgi?id=3857
> >
> > But that seems like a totally unambiguous case (a global property
> > function with two parameters is obviously a setter on the first
> > parameter in UFC).
> >
> > The getter seems much more problematic. Does anyone have a solution
> > besides adding more syntax? Should we disallow global properties to
> > avoid ambiguity?
>
> Ugh, it seems D still doesn't quite understand the concept of a property.
> Here:
>
> @property int foo() // Obviously getter
> @property void foo(int x) // Obviously setter
>
> No other form makes any sence as a property. Frankly, I'm very surprised,
> and dissapointed, that anything else is even allowed. The only *possible*
> exception being:
>
> @property int foo(int x) // Combined getter/setter, if we decide that's
> needed
>
> It doesn't make any sense for a property getter to have a parameter (unless
> it's one parameter and it's used to set a new value). And it doesn't make
> any sence for a setter to have anthing other than exactly one parameter.
> Just disallow it. What could possibly be the point anyway? If it's got
> parameters it's a function call, not a variable.
I agree 100%.
>
> Additionally, with that understanding in place, this:
>
> @property void foo(int x) {...}
> (3).foo();
>
> Is probably the one place where UFC syntax should never be allowed, because
> it's obviously a setter, and since when does this ever make any sence:
>
> int x;
> (3).x; // Set x to 3?? WTF??
If literals are considered const or immutable, then this takes care of itself,
since then the type system would then disallow it.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list