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)
此功能有什么问题,我该如何解决?
只需使用该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)