我的函数f
定义如下。
f(x, y) = 3x^2 + x*y - 2y + 1
如何为此方法检索以下quote
块,其中包括函数内容?
quote # REPL[0], line 2:
((3 * x ^ 2 + x * y) - 2y) + 1
end
答案 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)
编辑:这在