c - 这个熟悉的函数在 C 中是如何实现的呢?

标签 c lambda functional-programming lisp currying

考虑以下用 S-expr 表示法编写的代码段:

(lambda (x) (lambda (y) (+ x y)))

或者在 Javascript 中:

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

我如何用 C 语言编写它?

最佳答案

这在 C 中很难做到,因为它依赖于闭包。使用 C 时,您必须传递显式上下文,因此您最终可能会得到类似这样的结果。

#include <stdio.h>

struct closure {
    int saved_x;
    int (*function)(struct closure, int);
};

int second_half_add(struct closure context, int y) {
    return context.saved_x + y;
}

struct closure curried_add(int x) {
    struct closure ret;
    ret.saved_x = x;
    ret.function = second_half_add;
    return ret;
}

int main() {
    struct closure context = curried_add(3);
    printf("%d\n", context.function(context, 4));
}

这真的很难看,你几乎失去了柯里化(Currying)的所有好处,但这是可能的

关于c - 这个熟悉的函数在 C 中是如何实现的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7448467/

相关文章:

c - 如何编写用户空间 linux block 设备驱动程序?

C - 我不想分配我不会使用的内存! (新问题)

lambda - Lambda 函数中永远不会调用 RDS 与 Sequelize 的连接

java - 实现 map 功能

collections - Rust 中 Kotlin 的 `reduce` 操作的替代方案是什么?

c - 根据输入创建变量

c++ - lambda 函数中的 std::unique_ptr 导致段错误

c++ - 为什么可以使用 [=] 来修改 lambda 中的成员变量?

python - 应用 map 函数时在 python 中投影变量

python ctypes 返回零作为数组中的第一个元素?