在Julia中访问函数的AST

在Julia中访问函数的AST,julia,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,))

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

有没有别的办法得到这个表达式?运行dumpquote myFunc end时显示的函数,您无法访问函数的AST,因为函数是一组方法,在Julia中可能会以不同方式实现。如果它适合您的需要,您应该使用文档化的代码类型化函数,在该函数中,您可以指定参数的类型以选择正确的方法。中也有一些提示,但这是没有文档记录的功能,因此它可能会在没有警告的情况下更改。

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

dump不会给出结果;这只是一种打印价值的方式。正如您所看到的,它作为副作用打印,并返回一个空值

您给dump的是一个包含函数名的AST,而不是函数本身。dump并不是打印出函数的表示形式:它是说它有一个包含符号myFunc的一行块

如果需要AST,则应运行code_typedmyFunc,Any或code_loweredmyFunc,Any,。对于其他函数,您将需要不同和/或更具体的类型签名作为第二个参数

如果您只打算使用int或Float64s或其他任何函数调用myFunc,请使用它,而不要使用任何函数,因为类型推断将发生变化,这将对code_typed的输出产生影响

我写了一篇博客文章,记录了代码类型/代码类型的函数集: 我还花时间在那篇文章中,查看它们的输出、Expr类型并解释其结构

如果您还没有阅读过《官方手册》,该手册的内容可能对您使用ASTs很有用。

转储不会给出结果;这只是一种打印价值的方式。正如您所看到的,它作为副作用打印,并返回一个空值

您给dump的是一个包含函数名的AST,而不是函数本身。dump并不是打印出函数的表示形式:它是说它有一个包含符号myFunc的一行块

如果需要AST,则应运行code_typedmyFunc,Any或code_loweredmyFunc,Any,。对于其他函数,您将需要不同和/或更具体的类型签名作为第二个参数

如果您只打算使用int或Float64s或其他任何函数调用myFunc,请使用它,而不要使用任何函数,因为类型推断将发生变化,这将对code_typed的输出产生影响

我写了一篇博客文章,记录了代码类型/代码类型的函数集: 我还花时间在那篇文章中,查看它们的输出、Expr类型并解释其结构


如果您还没有阅读过《官方手册》,那么该手册的第二部分可能会对您使用ASTs有所帮助。

好的,谢谢您的澄清。我将编写一个宏,在创建函数的同时保留函数的源。这将适用于我的项目,即带有导数的项目,我想我会很快将其与calculation.jl合并。好的,谢谢你澄清这一点。我将编写一个宏,在创建函数的同时保留函数的源。这将适用于我的项目,一个带有导数的项目,我想我会很快将它与calculation.jl合并。