37 c functional-programming currying
假设我有一个指向函数的指针_stack_push(stack* stk, void* el).我希望能够调用curry(_stack_push, my_stack)并获取刚刚执行的功能void* el.我想不出办法,因为C不允许运行时函数定义,但我知道有比我更聪明的人:).有任何想法吗?
Jar*_*aus 20
我找到了Laurent Dami的一篇论文,讨论了C/C++/Objective-C中的currying:
具有Curried函数的C/C++/Objective-c中更多的功能可重用性
如何在C中实现:
我们当前的实现使用现有的C构造来添加currying机制.这比修改编译器要容易得多,并且足以证明currying的兴趣.然而,这种方法有两个缺点.首先,curried函数不能进行类型检查,因此需要小心使用以避免错误.其次,curry函数无法知道其参数的大小,并将它们视为整数的大小.
本文不包含实现curry(),但您可以想象如何使用函数指针和可变参数函数实现它.
GCC为嵌套函数的定义提供了扩展.虽然这不是ISO标准C,但这可能会引起一些兴趣,因为它可以非常方便地回答这个问题.简而言之,嵌套函数可以访问父函数局部变量,父函数也可以返回它们的指针.
这是一个简短的,不言自明的例子:
#include <stdio.h>
typedef int (*two_var_func) (int, int);
typedef int (*one_var_func) (int);
int add_int (int a, int b) {
return a+b;
}
one_var_func partial (two_var_func f, int a) {
int g (int b) {
return f (a, b);
}
return g;
}
int main (void) {
int a = 1;
int b = 2;
printf ("%d\n", add_int (a, b));
printf ("%d\n", partial (add_int, a) (b));
}
Run Code Online (Sandbox Code Playgroud)
然而,这种结构存在限制.如果你保留一个指向结果函数的指针,就像在
one_var_func u = partial (add_int, a);
Run Code Online (Sandbox Code Playgroud)
函数调用u(0)可导致意想不到的行为,作为变量a,其u读取被破坏后立即partial终止.
请参阅GCC文档的这一部分.