Idris:如何从 Vala/C 和 return 字符串调用 Idris 函数返回到 C/Vala

Idris: How do I call Idris function from Vala/C and return a string back to C/Vala

我有这个玩具 project:

对于 UI,我使用编译为 C 的 Vala 代码。因此我可以在 UI 中显示来自 Idris 的消息。

在 Idris 和 Vala/C 方面,我都有这个方法可以设置指向 Idris 函数的指针。所以在Vala代码中可以看到:

global::afni = fn;

用指向 Idris 函数的指针设置一个全局变量。 稍后在我调用的另一个 Vala 方法中:

    int res = global::afni(0);
    string da_label = @"blah $res";
    Gtk.Label label = new Gtk.Label (da_label);

所以我调用了 comFn 函数,该函数是通过存储在 global::afni 中的指针找到的,到目前为止还不错,它似乎可以处理整数。

但是如何让它与字符串一起工作?

我尝试了多种方法来更改类型和 return 字符串作为参数,但遇到了与无效指针相关的错误

free(): invalid pointer

munmap_chunk(): invalid pointer

Vala有所有权转移的概念。当一个字符串被一个函数 return 编辑时,Vala 假设它负责在它使用完后释放它。 Idris FFI 看起来它在 VM 中分配所有数据并永久管理它。

您可能需要告诉 Vala return 类型是 unowned string 而不是 string。这将阻止 Vala 尝试释放它。