我正在尝试了解Julia方法的AST。一个例子是以下功能:
function inner(o, p)
s = A1(o, p)
s = s + A2(o, p)
end
调用show(code_lowered(inner, (Int64, Int64))[1])
会显示类似
:($(Expr(:lambda, {:o,:p}, {{:#s908,:s},{{:o,:Any,0},{:p,:Any,0},{:#s908,:Any,18},{:s,:Any,2}},{}}, quote # /home/pool/projekt/julia/grouping.jl, line 7:
s = A1(o,p) # line 8:
#s908 = +(s,A2(o,p))
s = #s908
return #s908
end)))
我的问题是如何解释部分{{:#s908,:s},{{:o,:Any,0},{:p,:Any,0},{:#s908,:Any,18},{:s,:Any,2}},{}}
它似乎是两个局部变量{:#s908,:s}
。在此之后,列出了许多符号,包括函数参数和局部变量,每个都有类型信息和Int
,这是为了什么?我猜它是在本地范围内列出变量而Int
是某种属性?这些可能的价值和含义是什么?他们在某处记录了吗?
答案 0 :(得分:1)
如果你想要真正的AST,你不需要使用code_lowered
,只需quote
:
julia> ex = quote function inner(o, p)
s = A1(o, p)
s = s + A2(o, p)
end end
quote # none, line 1:
function inner(o,p) # none, line 2:
s = A1(o,p) # line 3:
s = +(s,A2(o,p))
end
end
julia>
julia> dump(ex)
Expr
head: Symbol block
args: Array(Any,(2,))
1: Expr
head: Symbol line
args: Array(Any,(2,))
1: Int64 1
2: Symbol none
typ: Any
2: Expr
head: Symbol function
args: Array(Any,(2,))
1: Expr
head: Symbol call
args: Array(Any,(3,))
typ: Any
2: Expr
head: Symbol block
args: Array(Any,(4,))
typ: Any
typ: Any
typ: Any
在去除合成糖之后,您正在查看带注释的AST。