如何解析julia表达式中变量的范围?

如何解析julia表达式中变量的范围?,julia,Julia,有没有办法在不运行任意表达式的情况下对其运行名称解析?e、 g.我想用这样的表达 quote x = 1 y = 2*x + 1 z = x^2 - 1 f(x) = 2*x + 1 end 并且被告知在该块范围内定义的名称是x,y,z,f,并且名称*,+,^,-从该块范围外拉入。如果它能告诉我在f的主体中定义了一个子作用域,它将创建自己的名称x,并从一个封闭的作用域中引入+,则会获得额外的积分 这个问题出现在上,感谢您的帮助 我们可以在julia表达式的最外层

有没有办法在不运行任意表达式的情况下对其运行名称解析?e、 g.我想用这样的表达

quote
    x = 1
    y = 2*x + 1
    z = x^2 - 1
    f(x) = 2*x + 1
end
并且被告知在该块范围内定义的名称是
x,y,z,f
,并且名称
*,+,^,-
从该块范围外拉入。如果它能告诉我在
f
的主体中定义了一个子作用域,它将创建自己的名称
x
,并从一个封闭的作用域中引入
+
,则会获得额外的积分

这个问题出现在

上,感谢您的帮助

我们可以在julia表达式的最外层范围内获得本地定义名称的列表,如下所示:

ex = quote
    x = 1
    y = 2*x + 1
    z = x^2 - 1
    f(x) = 2*x + 1
end
我们可以像这样从范围外获取符号:

_get_outers(_) = Symbol[]
_get_outers(x::Var) = x.is_global ? [x.name] : Symbol[]
function _get_outers(ex::Expr)
    @match ex begin
        Expr(:(=), _, rhs) => _get_outers(rhs)
        Expr(:tuple, _..., Expr(:(=), _, rhs)) => _get_outers(rhs)
        Expr(_, args...) => mapreduce(_get_outers, vcat, args)
    end
end

get_outers(ex) = (unique! ∘ _get_outers ∘ solve_from_local ∘ simplify_ex)(ex)

julia> get_outers(ex)
 6-element Array{Symbol,1}:
  :+
  :*
  :-
  :^

您可以解构整个语法树。如果您发现表达式使用的名称未在当前范围内指定或定义,则它们将从外部范围中提取。希望你明白我的意思:)
_get_outers(_) = Symbol[]
_get_outers(x::Var) = x.is_global ? [x.name] : Symbol[]
function _get_outers(ex::Expr)
    @match ex begin
        Expr(:(=), _, rhs) => _get_outers(rhs)
        Expr(:tuple, _..., Expr(:(=), _, rhs)) => _get_outers(rhs)
        Expr(_, args...) => mapreduce(_get_outers, vcat, args)
    end
end

get_outers(ex) = (unique! ∘ _get_outers ∘ solve_from_local ∘ simplify_ex)(ex)

julia> get_outers(ex)
 6-element Array{Symbol,1}:
  :+
  :*
  :-
  :^