本文介绍了用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高阶函数与最小的努力语法糖的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-17 20:29