Как позвонить в C callback из Цыпленка Схемы - PullRequest
0 голосов
/ 06 октября 2018

Я пишу библиотеку Chicken Scheme, которую в конечном итоге можно будет использовать из кода C.Для этого я определяю точку входа my_entrypoint из своего кода схемы.my_entrypoint принимает обратный вызов C, который выполняет вычисления:

(define-external (my_entrypoint ((function void (void)) compute)) void
  (let ([x (compute)])
    ...))

(return-to-host)

Как я могу адаптировать строку 2, чтобы моя библиотека собиралась и работала правильно.Мой код аварийно завершает работу со следующим журналом ошибок:

$ ./test

Error: call of non-procedure: #<pointer 0x10f47fb75>

    Call history:

    test.scm:5: return-to-host    
    test.scm:2: compute

Вот пример программы на C, которая использует мою библиотеку:

#include <chicken.h>

int compute_something(void)
{
  return 42;
}

void my_entrypoint(void (*)(void));

int main()
{
  C_word k = CHICKEN_run(C_toplevel);
  (void)k;
  my_entrypoint(&compute_something);
  return 0;
}

1 Ответ

0 голосов
/ 06 октября 2018

Насколько я знаю, вы не можете вызвать функцию C из Scheme, которая была передана в качестве аргумента.Самый простой способ - это сделать это с помощью локальной лямбды *, в которую вы передаете указатель функции, который затем может выполнить фактический вызов:

(define-external (my_entrypoint ((function int ()) compute-raw)) void
  (let* ((call-proc (foreign-lambda* int (((function int ()) compute))
                      "C_return(compute());"))
         (x (call-proc compute)))
    ...))

(return-to-host)
...