【发布时间】:2019-02-19 09:06:15
【问题描述】:
您将如何从使用 Julia 的 ccall 调用的 C 函数构造和返回 Julia Expr,比如 :(x + 2),最好这样它可以被 Julia 垃圾收集?
编辑:
由于建议进行一些其他详细信息的编辑,所以在这里。首先,问题不是一次性生成Expr,而是要能够逐步构建任意Exprs 等,见下文。
我需要一个用于 Julia 项目的解析器。解析器输入的内容部分是代数表达式,我希望最终得到等效的 Julia Expr。由于似乎没有带有 Julia 目标的解析器生成器,我正在考虑用 C++ 制作解析器(这很方便,因为我需要在同一个项目中对 C++ 代码使用相同的解析器语法),或者使用 flex/bison 或ANTLR。所以问题实际上是如何在 Julia 中从 C++ 解析器构建 AST。我有一些解决这个问题的想法:
- 在 Julia 中有一堆 C++ 代码可以调用的回调(例如,代数表达式的推送文字/添加等)并且 Julia 管理 AST 节点的分配。或者可能只是调用
Symbol()、Expr()等等,以及针对特定于问题的结构的更专门的回调。即使我对 Julia 很陌生,我想我也可以做到。 - 让 C++ 解析器生成一个普通结构的 AST,Julia 代码可以遍历该 AST 以构建等效的 Julia 结构。有点混乱的解决方案,但也许吧。
- 让 C++ 代码直接分配并返回 Julia AST,如果可能的话,我认为这相当于
jl_type_t和朋友的 AST。最大的问题是如何构建这样的结构。除了 .h 文件之外,我没有找到任何文档,这些文件的注释不是很好。而且我也怀疑在 C++ 代码中分配的内存是否可以在 Julia 中释放(垃圾收集),我想知道您如何解决这个问题。
【问题讨论】:
-
也许更多细节会有所帮助。如果 C 函数也可以调用 Julia 函数,那么您不能通过在 C 函数中调用
Expr()函数来创建 JuliaExpr吗?这不是解决方案吗? -
@Hckr 是的,也许,看看问题的编辑。