Julia中的拳击/拆箱复杂类型

时间:2017-05-10 19:41:24

标签: c scripting julia ffi

我基本上已经浏览了所有Julia文档,但我找不到任何答案。我的问题可以分为两部分。代码片段忽略基本初始化等内容。

第1部分:如何在没有jl_eval_string()

的情况下传递基本复杂类型

假设我有一个调用一些Julia脚本的C / C ++程序,用于执行f操作的函数String。在C源:

char* parameter_string; // Initialized as something.
jl_module_t *m = (jl_module_t *) jl_load("Script.jl");
jl_function_t *f = jl_get_function(m, "f");
jl_value_t * ret = jl_call1(f, /*???*/) <--- Problem

现在,请注意本手册仅描述了如何填充基元,如int,float,double。没有关于复杂类型的内容,例如String。是的,我可以使用jl_eval_string(parameter_string),但我不喜欢这个。此外,ret将是一个字符串,我不知道如何将其提取为C.它没有文档。

第2部分:

假设我有一个C / C ++程序调用一些Julia脚本,其中状态机是步进式的。要创建状态机,我创建了一些类型:

abstract State
type Idle <: State end
type State1 <: State end
type State2 <: State end

然后是过渡功能:

function transition(s :: State, input :: String) # input :: String is arbitrary
  .. Do Something ..
  return newState
end

现在,如果我想在C中创建一个State,比如Idle,我就找不到这样的东西,更不用说找到一种从Julia中检索它的方法。

我正在接近这个问题,或多或少像函数式编程语言,如Haskell,Scala或F#。这里的代数数据类型可能不太受支持,但我认为它仍然比用整数进行硬编码更好。

真正的问题是我在Julia上找不到任何C API文档,而没有直接挖掘它的源代码。

1 个答案:

答案 0 :(得分:4)

您可以使用String将C字符串转换为Julia jl_cstr_to_string(char*)

要从Julia String获取数据,请使用jl_string_ptr(jl_value_t*)

构造函数就像函数一样被调用,因此要调用构造函数,您可以使用jl_get_function(m, "Idle")并正常调用它。或者,要直接分配对象(绕过任何可能定义的构造函数,技术上有点危险),可以调用jl_new_struct(type, fields...)