将红色函数指针传递给 C

Pass Red function pointer to C

我知道如何将 Red/System 回调传递给 C 函数,但是否可以使用 Red 实现相同的功能?可以在运行时为 Red 函数 创建一个 Red/System 包装器 并将其传递给 C 函数?

我已经看了很多 bindings/code here and there,但没有找到任何可以解决我的问题的东西。

编辑:
假设我有一个简单的 Red 函数:

add-numbers: func[a b][a + b]

我有一个 Red/System 函数别名:

callback!: alias function! [a [integer!] b [integer!] return: [integer!]]

是否可以使用 Red/System 包装器以某种方式将上述 add-numbers 函数转换为 callback!

您可以在运行时创建一个 Red 函数并将其传递给 C 函数 -(不使用 Red/System),如下所示:

#include "red.h"

int main() {

    redOpen();

    // redDo("add-numbers: func[a b][a + b]"); // will not work
    redSet(redSymbol("add-numbers"), redDo("func [a b][a + b]"));
    redPrint(redCall(redWord("add-numbers"), redInteger(2), redInteger(3)));

    redClose();
    return 0;
}

您可以使用 #call 指令从 Red/System 调用红色 function!。只有简单的参数类型 auto-converted 适合你(比如数字和逻辑值),其余的,你需要使用 Red runtime API 来构造函数的参数并将其放置在 Red 堆栈上,并最终取回返回值。

使用 #call,您可以在 Red/System 中编写可以作为回调传递给 C 函数的包装函数。这是来自 LibRed 源代码的此类包装器的 an example