Recursion 从Julia AST中提取行号

Recursion 从Julia AST中提取行号,recursion,julia,metaprogramming,abstract-syntax-tree,Recursion,Julia,Metaprogramming,Abstract Syntax Tree,我正在使用以下函数从Julia ASTs中剥离行号: function filter_lineno(ex::Expr) filter!(ex.args) do e isa(e, LineNumberNode) && return false if isa(e, Expr) (e::Expr).head === :line && return fa

我正在使用以下函数从Julia ASTs中剥离行号:

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
但是当代码中有宏时,这似乎不能正常工作。下面是一个失败的例子:

expr = Meta.parse("begin run(``) end")
filter_lineno(expr)
我得到以下错误:

BoundsError:尝试访问索引[3]处的2元素数组{Any,1}
处理文档字符串时的另一个示例:

expr = Meta.parse("begin \"Here is the doc\"\nmodule X end end")
filter_lineno(expr)
结果如下:

quote
    Core.@doc module X
        end
end

此函数有什么问题,如何修复?

只需使用
宏工具
软件包:


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

这是一个重复的问题,我已经:
只需使用
Base.remove\u linenums!(ex)
它应该可以工作(TM)。

这在嵌套结构上不起作用。在这种情况下,您需要
MacroTools.prewalk(rmlines,expr)
MacroTools.striplines(expr)
。如果你编辑了答案,我就能把它标记为正确答案。我应该用第二个例子而不是第一个来测试它。谢谢适用于第一个示例,但不适用于第二个示例。我不这么认为,因为它在许多情况下都有效,并且与其他响应不同,它使用了核心Julia函数。