访问Julia中的函数的AST

时间:2013-11-24 21:44:23

标签: julia

在Julia中,可以查看用户定义函数的AST:

julia> myFunc(x) = 5*x+3
myFunc (generic function with 1 method)

julia> tmp = dump(quote myFunc end)
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: Symbol myFunc
  typ: Any

我感兴趣的是AST。但是,变量tmp不包含代表我期望的语法树的Expr

julia> tmp

julia> typeof(tmp)
Nothing (constructor with 1 method)

还有另一种方法可以获得此Expr吗? (运行dump(quote myFunc end)时显示的那个)

2 个答案:

答案 0 :(得分:3)

dump没有给你结果;它只是打印价值的一种方式。 (如您所见,它打印为副作用并返回nothing。)

你给的dump是一个包含你的函数的名称的AST,而不是函数本身。 dump未打印出您的函数表示:它表示它包含一行包含符号myFunc的块。

如果您想要AST,则应运行code_typed(myFunc,(Any,))code_lowered(myFunc,(Any,))。对于其他功能,您将需要不同的和/或更具体的类型签名作为第二个参数。

如果您只打算使用myFuncInt或其他任何方式致电Float64,请使用Any代替code_typed - 这会对{ {1}}的输出,因为类型推断会改变。

我写了一篇博文,记录了code_typed / code_lowered一组函数:http://blog.leahhanson.us/julia-introspects.html (我也花时间在那篇文章中查看他们的输出,Expr类型并解释它的结构。)

如果你还没有读过AST,那么官方手册的Metaprogramming section对你来说可能对你很有帮助。

答案 1 :(得分:2)

您无法访问函数的AST,因为函数是Julia中的方法集合(可能以不同方式实现)。如果它符合您的需要,您应该使用记录的code_typed函数,您可以在其中指定参数的类型以选择正确的方法。 Access the AST for generic functions in Julia中也有一些提示,但这不是文档记录的功能,因此可能会在没有警告的情况下进行更改。