如何在 C 中进行柯里化

问题描述 投票:0回答:1

在此代码中,我尝试返回一个可以将

ctx.a
添加到传递的参数
x
的函数。 预期的答案是 4,但运行此代码时,它打印出 6。 这里出了什么问题?

我已经尝试过这段代码:

#include <stdio.h>

typedef struct {
  int a;
} ctx_t;

typedef void(*with_ctx)(int);

with_ctx create_handler(ctx_t ctx) {
  void handler(int x) {
    printf("%d\n", ctx.a + x);
  }

  return handler;
}

int main() {

  ctx_t ctx = { .a = 1 };
  with_ctx handler = create_handler(ctx);
  handler(3);

  return 0;
}
c currying
1个回答
0
投票

C 不支持在函数内部声明函数。发生的情况是,您使用的编译器支持它作为 C 之上的扩展。我认为只有 gcc 支持它。

这里出了什么问题?

接下来发生的事情是变量

ctx
return handler; 之后停止
existing
。函数在
ctx
结束后,
create_handler
内的变量
}
作用域将停止存在。因此调用
handler()
将访问一些未定义的内存区域,即
ctx
used 所在的位置。已经不存在了。

不可能用 C 编程语言创建 lambda。请参阅 有没有办法在 C 中进行柯里化? .

© www.soinside.com 2019 - 2024. All rights reserved.