将红色函数指针传递给 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。
我知道如何将 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。