从 Julia AST 中剥离行号

ret*_*phy 2 recursion metaprogramming abstract-syntax-tree julia

我正在使用以下函数从 Julia AST 中去除行号:

function filter_lineno(ex::Expr)
           filter!(ex.args) do e
               isa(e, LineNumberNode) && return false
               if isa(e, Expr)
                   (e::Expr).head === :line && return false
                   filter_lineno(e::Expr)
               end
               return true
           end
           return ex
       end
Run Code Online (Sandbox Code Playgroud)

但是当代码中有宏时,这似乎无法正常工作。这是一个失败的例子:

expr = Meta.parse("begin run(``) end")
filter_lineno(expr)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

function filter_lineno(ex::Expr)
           filter!(ex.args) do e
               isa(e, LineNumberNode) && return false
               if isa(e, Expr)
                   (e::Expr).head === :line && return false
                   filter_lineno(e::Expr)
               end
               return true
           end
           return ex
       end
Run Code Online (Sandbox Code Playgroud)

处理文档字符串时的另一个示例:

expr = Meta.parse("begin \"Here is the doc\"\nmodule X end end")
filter_lineno(expr)
Run Code Online (Sandbox Code Playgroud)

产生以下结果:

quote
    Core.@doc module X
        end
end
Run Code Online (Sandbox Code Playgroud)

此功能有什么问题,我该如何解决?

Prz*_*fel 5

只需使用该MacroTools包:


julia> using MacroTools

julia> cc = Meta.parse("begin \"Here is the doc\"\nmodule X end end")
quote
    #= none:1 =#
    #= none:1 =# Core.@doc "Here is the doc" module X
        #= none:2 =#
        #= none:2 =#
        end
end

julia> MacroTools.striplines(cc)
quote
    Core.@doc "Here is the doc" module X
        end
end
Run Code Online (Sandbox Code Playgroud)


mig*_*raz 5

这是一个重复的问题,我之前已经在 SO 上回答过:只需使用Base.remove_linenums!(ex)它就可以工作(TM)。