【发布时间】:2018-01-09 02:42:37
【问题描述】:
我一直试图从元编程的角度来理解 Julia,并且经常发现自己处于希望从 Expr 生成面向用户的 Julia 语法的位置。
在 GitHub 上搜索源代码,我发现了 femtolisp 中定义的“deparse”函数。不过好像完全没有暴露。
我可以通过哪些方法仅使用内部表示生成正确的 Julia 表达式?
P。 S. 生成的 Julia 代码应该有某种美化工具,你知道一些这样的(未注册的)pkg 吗?
~#~#~#~#~
更新
我已将 julia 源文件的所有 Meta.show_sexpr 存储到另一个文件中。
# This function is identical to create_adder implementation above.
function create_adder(x)
y -> x + y
end
# You can also name the internal function, if you want
function create_adder(x)
function adder(y)
x + y
end
adder
end
add_10 = create_adder(10)
add_10(3) # => 13
转换为
(:line, 473, :none),
(:function, (:call, :create_adder, :x), (:block,
(:line, 474, :none),
(:function, (:call, :adder, :y), (:block,
(:line, 475, :none),
(:call, :+, :x, :y)
)),
(:line, 477, :none),
:adder
)),
(:line, 480, :none),
(:(=), :add_10, (:call, :create_adder, 10)),
(:line, 481, :none),
(:call, :add_10, 3))
现在,希望在 julia 中评估这些。
【问题讨论】:
-
CSTParser.jl,特别是通过 Visual Studio 代码扩展 github.com/JuliaEditorSupport/julia-vscode 提供了一个 Julia Prettyfier。
-
我很困惑你在问什么。如果你有一个现有的 Expr 类型变量,你可以使用
dump和Meta.show_sexpr来检查它的抽象语法树;您可以在终端上show表示。或者你是说你有“组件”并且你想从它们构建一个 Expr 实例? -
@TasosPapastylianou,正是第二种解释。我会更新上面的问题。
-
我不知道是否已经存在将 s_expressions 转换为 Expr 对象的函数,但是如果您有可以将
parse |> eval转换为元组序列的那种字符串输出,那么它不应该编写一个使用每个元组作为Expr构造函数的参数的递归函数太难了。 s_expressions 和 Expr 实例构造之间有明显的等价性:例如,:(1 + 2 * 3)的 s_expr 是(:call, :+, 1, (:call, :*, 2, 3))。将每个左括号视为对Expr构造函数的调用,我们有:Expr(:call, :+, 1, Expr(:call, :*, 2, 3))===:(1 + 2 * 3)
标签: parsing metaprogramming julia