On Jun 7, 11 03:22, Monkol wrote:
On Mon, 06 Jun 2011 22:00:13 +0300, Steven Schveighoffer
<[email protected]> wrote:

Someone wrote a very compelling argument for ufcs (uniform function
call syntax) for ranges, and that is, given a slew of range functions,
and a slew of ranges, it is nice to use a fluent programming syntax to
specify wrappers for ranges without having to extend each range type.
For example:

take(10,stride(2,cycle([3,2,5,3])));

vs.

[3,2,5,3].cycle().stride(2).take(10);

And I thought damn it would be nice if ranges could implement ufcs,
but other types that you didn't want to allow infinite extendability
could avoid it. That gave me an idea :)


import std.stdio;

struct ufcs
{
auto opDispatch(string name, T...)(T args) // appropriate if compiles
constraint here
{
mixin("return ." ~ name ~ "(this, args);");
}
}

int foo(ufcs x, int y)
{
writefln("it works! %d", y);
return y+1;
}

void main()
{
ufcs u;
auto x = u.foo(1);
assert(x == 2);
}

And it does indeed work (2.053)...

So we can have ufcs without any changes to the compiler, and we also
make it a *choice* for people who don't want to allow infinite
extendability, and don't want to deal with possible compiler ambiguities.

The opDispatch could even be a mixin itself (I think).

What do you think?

-Steve


may be you lost symbol "!" when call template opDispatch!(string name,
T...)(T args)

No Steven is correct. You don't need the '!' before the template parameters.

Reply via email to