Do we want functions to act as properties, or merely omit parens for ufcs/chaining?
Chad Joan
chadjoan at gmail.com
Tue Jan 29 06:03:30 PST 2013
On 01/29/2013 06:03 AM, sclytrack wrote:
> On Tuesday, 29 January 2013 at 10:34:59 UTC, Sönke Ludwig wrote:
>> Am 29.01.2013 05:16, schrieb sclytrack:
>>> On Tuesday, 29 January 2013 at 01:09:17 UTC, F i L wrote:
>>>> why in the hell would you want:
>>>>
>>>> writeln = "lolwut";
>>>>
>>>> to compile in the first place?
>>>
>>> If you disallow this. You will have to invent something else than
>>> opDispatch.
>>> Something that serves them both. opPropMethodDispatch maybe.
>>
>>
>> template opDispatch(string name)
>> {
>> static if( isAProperty!name ){
>> @property int opDispatch() { return 0; }
>> } else {
>> void opDispatch() {}
>> }
>> }
>>
>> or similar should work.
>
> I meant for dynamic D where you don't know if it is a property or a
> method at compile time. Where you don't know if the method even exists
> or not.
>
> Overloading on an annotation is just weird. Either something is
> annotated or not.
>
> Going to eat now.
>
>
I didn't think it was an overload. I also don't understand the bit
about dynamic D, because the dispatch in opDispatch always occurs at
compile-time. Any strings used as method names on a type with
opDispatch must be known at compile-time. This is reasonably expressive
enough that I wonder if you're doing other dynamic calculations behind
that all.
That template works, though I was also thinking about this natural use-case:
import std.stdio;
class Foo
{
void opDispatch(string name)(int arg)
{
writefln("%s(%s) called",name,arg);
}
@property opDispatch(string name : "prop")(int arg)
{
writefln("prop = %s", arg);
}
}
void main()
{
auto f = new Foo();
f.test(5);
f.prop = 9;
}
// Writes:
// test(5) called
// prop = 9
This might be confusing to me because I'm not sure what your use case
is. How are you generating your opDispatch functions currently where
this becomes a problem?
More information about the Digitalmars-d
mailing list