Передать красный указатель функции на C
Я знаю как пройти Red/System
обратный вызов функции C, но такой же функциональности можно достичь с помощью Red
? Можно создать Red/System
обертка для Red
функция во время выполнения и передать его функции C?
Я уже посмотрел на множество привязок / кода здесь и там, но не нашел ничего, что решило бы мою проблему.
Редактировать:
Допустим, у меня есть простой Red
функция:
add-numbers: func[a b][a + b]
и у меня есть Red/System
псевдоним функции:
callback!: alias function! [a [integer!] b [integer!] return: [integer!]]
Можно ли как-то конвертировать вышеперечисленное add-numbers
функция к callback!
используя Red/System
обертка?
2 ответа
Вы можете вызвать красный function!
из Red/System с использованием директивы #call. Только простые типы аргументов автоматически преобразуются для вас (например, числа и логические значения), в остальном вам нужно использовать API времени выполнения Red для создания и размещения аргументов функции в стеке Red и, в конечном итоге, для получения возвращенного значения.
С помощью #call
Вы можете написать функции-обертки в Red/System, которые могут быть переданы как обратные вызовы для функций C. Вот пример такой оболочки из исходного кода LibRed.
Вы можете создать функцию 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;
}