方法AST的解释

时间:2014-01-29 18:10:36

标签: abstract-syntax-tree julia

我正在尝试了解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是某种属性?这些可能的价值和含义是什么?他们在某处记录了吗?

1 个答案:

答案 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。