Recursion 从Julia AST中提取行号
我正在使用以下函数从Julia ASTs中剥离行号: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
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函数。