Как назначить функцию члену структуры Rebol - PullRequest
0 голосов
/ 25 июня 2018

Сначала я определяю функцию ADD:

add: func [ a [integer!] b [integer!] ] [a + b]

Тогда структура:

s: make struct! [
    sadd [ function! ]
] add

Но структура Rebol не поддерживает ФУНКЦИЮ! тип данных. Как я могу назначить функцию для структуры Rebol?

1 Ответ

0 голосов
/ 26 июня 2018

Обратные вызовы являются альфа-функцией 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
...