如何解析julia表达式中变量的范围?
有没有办法在不运行任意表达式的情况下对其运行名称解析?e、 g.我想用这样的表达如何解析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表达式的最外层
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}:
:+
:*
:-
:^