在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)
时显示的那个)
答案 0 :(得分:3)
dump
没有给你结果;它只是打印价值的一种方式。 (如您所见,它打印为副作用并返回nothing
。)
你给的dump
是一个包含你的函数的名称的AST,而不是函数本身。 dump
未打印出您的函数表示:它表示它包含一行包含符号myFunc
的块。
如果您想要AST,则应运行code_typed(myFunc,(Any,))
或code_lowered(myFunc,(Any,))
。对于其他功能,您将需要不同的和/或更具体的类型签名作为第二个参数。
如果您只打算使用myFunc
或Int
或其他任何方式致电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中也有一些提示,但这不是文档记录的功能,因此可能会在没有警告的情况下进行更改。