2

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

我已经在这里那里查看了很多绑定/代码,但没有找到任何可以解决我的问题的东西。

编辑:
假设我有一个简单的Red功能:

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

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

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

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

4

2 回答 2

2

您可以使用#call指令function!从 Red/System调用 Red 。只有简单的参数类型会为您自动转换(如数字和逻辑值),其余的,您需要使用 Red 运行时 API 来构造函数的参数并将其放置在 Red 堆栈上,并最终检索返回的值。

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

于 2018-03-03T12:19:08.143 回答
0

您可以在运行时创建一个 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;
}
于 2018-01-15T08:53:37.310 回答