小智 5
回顾一下:看起来Simon一直在寻找与泛型函数关联的特定方法的AST。我们可以LambdaStaticData为特定方法获取包含AST 的对象,如下所示:
julia> f(x,y)=x+y
julia> f0 = methods(f, (Any, Any))[1]
((Any,Any),(),AST(:($(expr(:lambda, {x, y}, {{}, {{x, Any, 0}, {y, Any, 0}}, {}}, quote # none, line 1:
return +(x,y)
end)))),())
julia> f0[3]
AST(:($(expr(:lambda, {x, y}, {{}, {{x, Any, 0}, {y, Any, 0}}, {}}, quote # none, line 1:
return +(x,y)
end))))
julia> typeof(ans)
LambdaStaticData
Run Code Online (Sandbox Code Playgroud)
显然,此AST可以是Expr对象或压缩的AST对象,以字节序列表示:
julia> typeof(f0[3].ast)
Array{Uint8,1}
Run Code Online (Sandbox Code Playgroud)
from 的show()方法说明了遇到这种情况时如何解压缩:LambdaStaticDatabase/show.jl
julia> ccall(:jl_uncompress_ast, Any, (Any, Any), f0[3], f0[3].ast)
:($(expr(:lambda, {x, y}, {{}, {{x, Any, 0}, {y, Any, 0}}, {}}, quote # none, line 1:
return +(x,y)
end)))
julia> typeof(ans)
Expr
Run Code Online (Sandbox Code Playgroud)