Обратные вызовы являются альфа-функцией Rebol2.См. Документ Carl для документации.
По существу, если у вас есть dll, такой как test-lib.dll, где функция test берет два целых числа и возвращает их снова без изменений
extern "C"
MYDLL_API int test(int a, int b, int (*pFunc)(int, int))
{
int result = pFunc(a, b);
return result;
}
вы бы написали вызывающую функцию из Rebol следующим образом:
test: make routine! [
a [int]
b [int]
c [callback [int int return: [int]]]
return: [int]
] test-lib "test"
Итак, эта тестовая функция принимает два целых числа в качестве параметров и третий параметр, который является функцией Rebol для использования в качестве обратного вызова. обратный вызов в рутине!это ключевое слово.Спецификация блока автоматически преобразуется в структуру!
Функция обратного вызова записывается следующим образом: она принимает два целых числа, возвращаемых библиотечным вызовом, добавляет их и возвращает их.
add-it: func [a b][return a + b]
И тогда он используется так
>> test 1 2 :add-it
== 3