如何从 Chicken Scheme 调用 C 回调
How to call C callback from Chicken Scheme
我正在编写最终可以从 C 代码使用的 Chicken Scheme 库。为此,我从我的 Scheme 代码中定义了入口点 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;
}
据我所知,您不能从作为参数传递的 Scheme 中调用 C 函数。最简单的方法是使用本地的 foreign-lambda* 将函数指针传递给它,然后它可以进行实际调用:
(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)
我正在编写最终可以从 C 代码使用的 Chicken Scheme 库。为此,我从我的 Scheme 代码中定义了入口点 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;
}
据我所知,您不能从作为参数传递的 Scheme 中调用 C 函数。最简单的方法是使用本地的 foreign-lambda* 将函数指针传递给它,然后它可以进行实际调用:
(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)