我基本上已经浏览了所有Julia文档,但我找不到任何答案。我的问题可以分为两部分。代码片段忽略基本初始化等内容。
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.它没有文档。
假设我有一个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文档,而没有直接挖掘它的源代码。
答案 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...)
。