【问题标题】:Boxing/Unboxing complex types in Julia在 Julia 中装箱/拆箱复杂类型
【发布时间】:2017-05-10 19:41:23
【问题描述】:

我基本上已经浏览了所有 Julia 文档,但我找不到任何答案。我的问题可以分为两部分。代码 sn-ps 忽略基本 s 初始化之类的东西。

第 1 部分:如何在没有jl_eval_string() 的情况下传递基本复杂类型

假设我有一个 C/C++ 程序,它调用一些 Julia 脚本,为一个函数 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 文档,除非直接深入研究它的源代码。

【问题讨论】:

    标签: c scripting julia ffi


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的,我明白了。顺便说一句,我对 Julia 的类型系统不太熟悉,所以我不确定这种类似 ADT 的结构是否真的可以工作
    • 那么检索呢?是不是类似于ret-&gt;type?还是jl_valueof()jl_typeof()?它们是宏,所以我真的不知道它们的类型
    • 是的,您可以使用jl_typeof() 获取jl_value_t* 的类型。 jl_value_t* 本身已经指向数据区(在类型标记之后)。
    • 如果我在复杂类型上使用jl_valueof() 会得到什么?或者,这是jl_get_nth_field()jl_get_field() 的用途吗? (是啊,浏览 1800+ 行代码猜 API 真的不好玩……)
    • 如果您想访问复合值的字段,是的,您需要jl_get_nth_fieldjl_get_field。我同意嵌入文档需要涵盖更多内容,但我不确定jl_get_field 除了获取字段之外会做什么。 jl_get_nth_field 更快,因为它避免了查找字段名称的索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2021-09-18
    • 1970-01-01
    • 2012-10-27
    • 2011-09-19
    • 1970-01-01
    相关资源
    最近更新 更多