将方法内容检索为“Expr”

时间:2017-02-28 16:48:52

标签: expression julia

我的函数f定义如下。

f(x, y) = 3x^2 + x*y - 2y + 1

如何为此方法检索以下quote块,其中包括函数内容?

quote  # REPL[0], line 2:
    ((3 * x ^ 2 + x * y) - 2y) + 1
end

2 个答案:

答案 0 :(得分:5)

正如大家在评论中提到的那样,挖掘这样的方法领域并不是一个稳定的或官方支持的API。此外,你的简单例子是欺骗。通常,这不代表您为该方法编写的原始代码。它是一个简化的中间AST表示,具有单指派变量和极大简化的控制流程。通常,它返回的AST不是有效的顶级Julia代码。事实恰恰相反,对于你的简单例子,它就是。

也就是说,有一种记录的方法可以做到这一点。您可以使用code_lowered()来访问此中间表示,而无需挖掘未记录的字段。这将适用于Julia版本,但我认为尚未对中间表示的稳定性进行官方保证。这是一个稍微复杂的例子:

{{1}}

如果确实希望完全按照编写的方式查看代码,最好的方法是使用嵌入的文件和行信息并参考原始来源。请注意,这正是Gallium.jl(Julia的调试器)在逐步执行函数时查找源的方式。它没有文档,但您甚至可以访问交互式定义的函数的REPL历史记录。 See how Gallium does it through here

答案 1 :(得分:0)

首先,使用methods(f)检索方法。

julia> methods(f)
# 1 method for generic function "f":
f(x, y) at REPL[1]:1

julia> methods(f).ms
1-element Array{Method,1}:
 f(x, y) at REPL[1]:1

julia> method = methods(f).ms[1]
f(x, y) at REPL[1]:1

从这里开始,检索Expr ession很简单;只需使用方法的lambda_template属性。

julia> method.lambda_template
LambdaInfo template for f(x, y) at REPL[1]:1
:(begin 
        nothing
        return ((3 * x ^ 2 + x * y) - 2 * y) + 1
    end)

编辑:这在 v0.6 +!

有效