最小限の労力でシンタックス シュガーとして 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 操作とラムダ リフティングで十分だと思います。
私のアプローチに潜在的な欠陥はありますか? HOF のより簡単な方法はありますか、または実装を容易にするためにアプローチを改善できますか?