在Julia中访问AST以获取通用功能

Sim*_*rne 3 julia

如何在Julia中访问通用函数的抽象语法树?

小智 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)