获取 Julia 中函数体的表达式树

问题描述 投票:0回答:1

Julia(或包中)是否有一个函数或宏,给定一个函数返回表示其主体的表达式对象(Expr);或者,换句话说,返回其定义中使用的表达式?

例如,假设函数

foo
在某处定义为

function foo(x, y)
    z = 2 * x
    return z + y
end

然后,假设调用该函数

definition
,调用
definition(foo)
应该返回表达式

quote
    z = 2 * x
    z + y
end

原则上这也适用于匿名函数。

definition(x -> 2 + x)
的返回值应该是表达式

:(2 + x)

我只能找到诸如

@code_lowered
@code_typed
之类的宏,这些宏可以在 LLVM 内部表示或本机机器代码级别获取代码,但在表达式级别却找不到。

reflection julia metaprogramming
1个回答
0
投票

您可能正在寻找

Meta.parse
(请参阅文档https://docs.julialang.org/en/v1/base/base/#Base.Meta.parse-Tuple{AbstractString,%20Int64}):

julia> foo_text = """function foo(x, y)
           z = 2 * x
           return z + y
       end"""
"function foo(x, y)\n    z = 2 * x\n    return z + y\nend"

julia> Meta.parse(foo_text)
:(function foo(x, y)
      #= none:1 =#
      #= none:2 =#
      z = 2x
      #= none:3 =#
      return z + y
  end)

注意

Meta.parse
解析文本,而不是函数本身。您可以调用
eval()
来计算
Meta.parse
返回的表达式。

© www.soinside.com 2019 - 2024. All rights reserved.