如何在 Julia 中查找和替换 AST 的子表达式



>假设我有一个像:(Main.i / (0.5 * Main.i * sin(Main.i))这样的表达式。

我想将每次出现的Main.i替换为其他符号。在朱莉娅有没有一种惯用的方法可以做到这一点?

Main.i

不是一个符号,而是一个表达式,您可以通过执行dump(:(Main.i))来检查。

以下是我认为可能符合您需求的快速文章:

function expr_replace(expr, old, new)
expr == old && return new
if expr isa Expr
expr = deepcopy(expr) # to avoid mutation of source
for i in eachindex(expr.args)
expr.args[i] = expr_replace(expr.args[i], old, new)
end
end
expr
end

它对你有用吗?

编辑:这是一个对deepcopy进行最小安全使用的版本:

function expr_replace(expr, old, new)
function f(expr)
expr == old && return deepcopy(new)
if expr isa Expr
for i in eachindex(expr.args)
expr.args[i] = f(expr.args[i])
end
end
expr
end
f(deepcopy(expr))
end

一般来说,我想这并不重要,因为您可能不想通过此函数传递 100 行代码。

最新更新