本文介绍了用C高阶函数与最小的努力语法糖的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我要实现用C高阶函数(HOFs)与最小的努力语法糖。
例如,对于以下code
I want to implement higher-order functions (HOFs) in C as a syntactic sugar with minimal effort.For example, for the following code
function add(int x) {
return int(int y) {
return x + y;
};
}
int main() {
function add1 = add(1);
return add1(2);
}
是 transcompiled 的成纯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);
}
我已经运行这个(手动)transcompiled版本,它工作正常。为了实现,我相信有些AST操纵和lambda提升就足够了。
I have run this (manually) transcompiled version and it works fine. For implementation, I believe some AST manipulation and lambda lifting would be enough.
是否有我的方法的潜在缺陷?是否有任何HOFs方法更容易,或者我可以提高我的做法,使之更容易实现?
Are there any potential flaws in my approach? Are there any easier methods for HOFs, or can I improve my approach to make it easier to implement?
推荐答案
有两个明显的问题,现在:
There are two obvious problems by now:
- 使用无效*重新present参数和返回任何类型的值
最终将会被突破。考虑在IA-32长长参数,或者
任何结构按值传递。 - 这是很难(如果可能),使高阶函数没有垃圾收集有用的。您可以从自己的例子,其中的上下文$ 1 malloc分配,但从来没有free'd看到它。贝姆GC可能有助于在这里。
这篇关于用C高阶函数与最小的努力语法糖的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!