有没有办法在C中做cur?

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(),但您可以想象如何使用函数指针可变参数函数实现它.

  • +1很棒的发现,我喜欢"虽然我们没有进行大量的测试,但我们可以估计一个curried函数调用比正常函数调用慢大约60倍." (9认同)
  • (我喜欢它,因为有时你需要非常糟糕的东西,而且运行速度只有60倍的解决方案比无解决方案要好得多.) (5认同)

use*_*513 6

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文档的这一部分.

  • 从手册(在你提供的链接下):"如果你试图在包含的函数退出后通过它的地址调用嵌套函数,**所有的地狱都会破坏**." (8认同)