1

在 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)

4

2 回答 2

4

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

您提供dump的是包含函数名称的 AST ,而不是函数本身。dump没有打印出你的函数的表示:它说它有一行包含符号的块myFunc

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

如果您只打算myFunc使用Ints 或Float64s 或其他方式调用,请使用它而不是Any-- 这将对code_typed' 的输出产生影响,因为类型推断会发生变化。

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

如果您尚未阅读官方手册的元编程部分,可能会对您使用 AST 有所帮助。

于 2013-11-27T01:45:44.607 回答
2

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

于 2013-11-25T08:32:12.120 回答