A functor-based curry: YET I HAVE PROBLEM
Im, Jihyuk
icedac at g-nospam-mail.com
Tue Jan 29 20:48:52 PST 2008
there're some errata in code but maybe anybody know what's the point
below code is the right one
[code]
template Foo( R, A, U )
{
R delegate (U) Foo( R delegate ( A, U ) dg, A a )
{
R Foo_( U u )
{ R i; return i; }
return &Foo_;
}
}
R delegate (U) Foo2( R, A, U...)( R delegate ( A, U ) dg, A a )
{
R Foo2_( U u )
{ R i; return i; }
return &Foo2_;
}
[/code]
--
Im, Jihyuk aka gshock
http://www.xecode.com/blog2
"Im, Jihyuk" <icedac at g-nospam-mail.com> wrote in message
news:fnov9q$sq1$1 at digitalmars.com...
> thanx for your kind reply :)
>
> now I get to know the problem was a function template block should has one
> definition inside.
> but I think if the second code works fine, I think it's useful for
> listing template parameter once and use various tempalte declaration but
> the parameter deduced with parameters to
> template function inside.
>
> Indeed my third code works fine for me :) your code contains string code
> evaluation and mixin that's yet tough to me as c++ programmer
>
> But i found this simple code also emits duduction failure error
>
> [code]
> template Foo( R, A, U )
> {
> R delegate (U) Foo( R delegate ( A, U ) dg, A a )
> {
> R Foo_( U u )
> { R i; return i; }
> return &Foo2_;
> }
> }
>
> void my_test()
> {
> int plus_3( int a, int b, int c )
> {
> return a+b+c;
> }
>
> Foo( &plus_3, 10 ); // deduction failure
> }
> [/code]
>
> in simpler function template works fine like:
>
> [code]
> R delegate (U) Foo2( R, A, U...)( R delegate ( A, U ) dg, A a )
> {
> R Foo_( U u )
> { R i; return i; }
> return &Foo2_;
> }
> Foo2( &plus_3, 10 ); // ok
> [/code]
>
> What's the problem? bug? or is there anything that i couldn't get yet?
>
> "downs" <default_357-line at yahoo.de> wrote in message
> news:fnncoj$2g95$1 at digitalmars.com...
>> [snip]
>>
>> Your example doesn't work because a function template must only contain
>> exactly a single defined symbol that has the same name as the template.
>>
>> Here's a simple functor version:
>>
>>> import std.stdio, std.traits;
>>>
>>
>> A sample function
>>
>>> int add(int a, int b, int c) { return a+b+c; }
>>>
>>
>> The initialization of T
>>
>>> template Init(T) { T Init; }
>>>
>>> class CurryFunctor(C, P...) {
>>> C callable;
>>> P params;
>>> this(C c, P p) {
>>> callable = c;
>>> foreach (id, v; p) params[id] = v;
>>> }
>>
>> The purpose of this is to allow a kind of automatic return type
>> deduction.
>> Think of this as the function body of opCall.
>>
>>> const string CODE = "
>>> static if (is(typeof(callable(params, Init!(R))))) {
>>> return callable(params, rest);
>>> } else
>>> return curry(callable, params, rest);
>>> ";
>>
>> Now we use our function body to determine the return type of opCall, by
>> asking the question:
>> "If our function were a function literal that took no parameters
>> (declaring rest as a variable;
>> this is okay because this function literal is never called), then what
>> would its type be?"
>>
>>> typeof(mixin("function(){ R rest; "~CODE~" }()")) opCall(R...)(R rest)
>>> {
>>> mixin(CODE);
>>> }
>>> }
>>>
>>
>> A simple wrapper.
>>
>>> CurryFunctor!(C, P) curry(C, P...)(C callable, P params) {
>>> return new CurryFunctor!(C, P)(callable, params);
>>> }
>>>
>>
>> And examples.
>>
>>> void main() {
>>> writefln(curry(&add, 2, 3)(5));
>>> writefln(curry(&add, 2)(3)(4));
>>> }
>>
>> Have fun with it!
>>
>> --downs
>
>
More information about the Digitalmars-d-learn
mailing list