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

标签 c compiler-construction higher-order-functions

我想以最小的努力在 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/

相关文章:

c - 数组指针如何存储它的大小?

java - 动态生成变量名

javascript - 构建依赖于第三方脚本的组件

javascript - 解释 "you can have functions that change other functions"

ruby - 如何使用 'do' 关键字语法创建接受匿名函数的函数?

c - 当函数调用预处理器指令时,输出会有所不同。为什么?

c - 设置中断以监视引脚变化

haskell - 为什么 Template Haskell 在编译期间允许任意 IO 操作?

c - 如何从汇编代码构建数据依赖图

compiler-construction - 请参阅以前的 ./configure 选项