假设我有一个类似:(Main.i / (0.5 * Main.i * sin(Main.i))
的表达式。
我想将Main.i
的每次出现替换为其他符号。朱莉娅有惯用的方法吗?
答案 0 :(得分:3)
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行代码。