我想以最少的努力在 C 中实现高阶函数 (HOF) 作为语法糖。
例如,对于以下代码
function add(int x) {
return int(int y) {
return x + y;
};
}
int main() {
function add1 = add(1);
return add1(2);
}
it is 转编译的转化为纯C
#include <stdlib.h>
typedef struct {
void *ctx;
void* (*fun)(void *arg, void *ctx);
} function;
function new_function(void *ctx, void* (*fun)(void *, void *)) {
function f = {.ctx=ctx, .fun=fun};
return f;
}
void* apply(function f, void *arg) {
return (*(f.fun))(arg, f.ctx);
}
typedef struct {
int x;
} context$1;
void* new_context$1(int x) {
context$1 *ctx = malloc(sizeof(context$1));
ctx->x = x;
return ctx;
}
void* function$1(void *arg, void *ctx) {
int y = (int)arg;
int x = ((context$1*)ctx)->x;
return (void*)(x + y);
}
function add(int x) {
return new_function(new_context$1(x), function$1);
}
int main() {
function add1 = add(1);
return (int)apply(add1, (void*)2);
}
我已经运行了这个(手动)转编译版本,它工作正常。对于实现,我相信一些 AST 操作和 lambda 提升就足够了。
我的方法有任何潜在的缺陷吗? HOF 是否有更简单的方法,或者我可以改进我的方法以使其更容易实现吗?
目前有两个明显的问题:
- 使用void*表示任意类型的参数和返回值
最终会破裂。考虑 ia-32 上的“long long”参数,或者
任何按值传递的结构。
- 如果没有垃圾回收,很难(如果可能的话)使高阶函数变得有用。您可以从您自己的示例中看到,其中 context$1 已分配但从未释放。 Boehm GC 在这里可能会有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)