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

时间:2018-08-20 10:39:05

标签: julia metaprogramming

假设我有一个类似:(Main.i / (0.5 * Main.i * sin(Main.i))的表达式。

我想将Main.i的每次出现替换为其他符号。朱莉娅有惯用的方法吗?

1 个答案:

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