【问题标题】:How to call C callback from Chicken Scheme如何从鸡计划中调用 C 回调
【发布时间】:2018-10-05 21:55:28
【问题描述】:

我正在编写一个最终可以在 C 代码中使用的 Chicken Scheme 库。为此,我从我的 Scheme 代码中定义了入口点 my_entrypointmy_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;
}

【问题讨论】:

    标签: chicken-scheme


    【解决方案1】:

    据我所知,您不能从作为参数传递的 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 函数实际上可能更有意义。然后,这可以调用您使用 define-external 定义的 Scheme 过程来完成结果的其余工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多