首页 > 解决方案 > 如何在 Julia 中查找和替换 AST 的子表达式

问题描述

假设我有一个像:(Main.i / (0.5 * Main.i * sin(Main.i)).

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

标签: juliametaprogramming

解决方案


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 行代码。


推荐阅读