gpt4 book ai didi

expression - 以 `Expr` session 的形式检索方法内容

转载 作者:行者123 更新时间:2023-12-01 11:21:17 25 4
gpt4 key购买 nike

我有一个功能 f定义如下。

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

如何检索以下内容 quote该方法的块,其中包括函数内容?
quote  # REPL[0], line 2:
((3 * x ^ 2 + x * y) - 2y) + 1
end

最佳答案

正如人们在评论中提到的那样,像这样挖掘方法的领域并不是一个稳定的或官方支持的 API。此外,您的简单示例具有欺骗性。通常,这并不代表您为该方法编写的原始代码。它是一种简化的中间 AST 表示,具有单赋值变量和大大简化的控制流程。通常,它返回的 AST 不是有效的顶级 Julia 代码。碰巧的是,对于您的简单示例,确实如此。

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

julia> f(X) = for elt in X; println(elt); end
f (generic function with 1 method)

julia> code_lowered(f)[1]
LambdaInfo template for f(X) at REPL[17]:1
:(begin
nothing
SSAValue(0) = X
#temp# = (Base.start)(SSAValue(0))
4:
unless !((Base.done)(SSAValue(0),#temp#)) goto 13
SSAValue(1) = (Base.next)(SSAValue(0),#temp#)
elt = (Core.getfield)(SSAValue(1),1)
#temp# = (Core.getfield)(SSAValue(1),2) # line 1:
(Main.println)(elt)
11:
goto 4
13:
return
end)

julia> code_lowered(f)[1] == methods(f).ms[1].lambda_template
true

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

关于expression - 以 `Expr` session 的形式检索方法内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42514371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com