chicken-scheme - 如何从鸡计划中调用 C 回调
问题描述
我正在编写一个最终可以从 C 代码中使用的 Chicken Scheme 库。为此,我my_entrypoint
从我的 Scheme 代码中定义了入口点。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)
推荐阅读
- laravel - Laravel BelongsToMany 以 id 数组作为属性而不是单个 id
- javascript - 如何使用专辑标题按钮暂停歌曲
- c# - 如何在 C# 中重新启动任务?或如何重新启动 Thread.Sleep()?
- swift - 将 NSAllowsArbitraryLoads 设置为 false 不会阻止 iOS 应用程序中 WKWebView 中的 HTTP 请求
- vue.js - Vuex 访问模块状态来自 store
- angular - 从 2.0 升级到 Spartacus 3.0 后出错,TypeError: Cannot read property 'findStores' of undefined
- javascript - mapbox中数据驱动样式时结合case表达式和属性
- python - 如何通过 XPath 在 selenium 中查找具有多个类的元素?
- kotlin - 想要添加第二个骰子并获得与第一个不同的随机结果
- python - 从由数组组成的数据框中取列的平均值