gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:08:57 25 4
gpt4 key购买 nike

有没有办法在不运行任意表达式的情况下运行名称解析?例如我想要一个表达式,例如

quote
x = 1
y = 2*x + 1
z = x^2 - 1
f(x) = 2*x + 1
end
并被告知在此块范围内定义的名称是 x, y, z, f和名字 *, +, ^, -从这个块的范围之外拉入。如果它可以告诉我在 f 的正文中定义了一个子范围,则加分。这创造了它自己的名字 x并拉入 +从一个封闭的范围。
这个问题出现在 Julia Zulip community

最佳答案

感谢 Takafumishowing me how to solve this on Zulip
我们可以在 julia 表达式的最外层范围内获取本地定义的名称列表,如下所示:

ex = quote
x = 1
y = 2*x + 1
z = x^2 - 1
f(x) = 2*x + 1
end
using JuliaVariables, MLStyle

function get_locals(ex::Expr)
vars = (solve_from_local ∘ simplify_ex)(ex).args[1].bounds
map(x -> x.name, vars)
end

julia> get_locals(ex)
4-element Array{Symbol,1}:
:f
:y
:z
:x
我们可以像这样从范围外拉入符号:
_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}:
:+
:*
:-
:^

关于julia - 如何解决 julia 表达式中变量的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64252864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com