gpt4 book ai didi

c - C 中的高阶函数作为语法糖,工作量最小

转载 作者:太空狗 更新时间:2023-10-29 17:25:13 25 4
gpt4 key购买 nike

我想以最小的努力在 C 中实现高阶函数 (HOF) 作为语法糖。例如,对于下面的代码

function add(int x) {
return int(int y) {
return x + y;
};
}

int main() {
function add1 = add(1);
return add1(2);
}

它被转译为纯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 可能会在这方面提供帮助。

关于c - C 中的高阶函数作为语法糖,工作量最小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14160516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com