Передать красный указатель функции на 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;
}
Другие вопросы по тегам