static int s_first = 0;
int (*)(int) add( int second )
{
return( first + second );
}
int (*)(int) make_curried_add( int first )
{
s_first = first;
return(add);
}
void main(void)
{
int (*curried_add)(int);
curried_add1 = make_curried_add(1);
curried_add2 = make_curried_add(2);
curried_add3 = make_curried_add(3);
printf(\u0026quot;%d\u0026quot;, curried_add1(2));
printf(\u0026quot;%d\u0026quot;, curried_add2(2));
printf(\u0026quot;%d\u0026quot;, curried_add3(2));
}
$ ./a.out
3
4
5
こっちの方が近いと思います。ですがC言語だと正しい意味でのカリー化を実現できません。もしも上記の例を実際に行なうと、make_curried_add() を異なる引数で複数回呼んでも返される関数は全て同じ内容になり最後の引数で上書きされます。
なので実際には
$ ./a.out
5
5
5
になります。