在`Expr`中剥离`LineNumberNode`的通用函数(应该能够处理:macrocalls)?

Gni*_*muc 6 julia

是否有一个内置的朱莉娅功能剥离LineNumberNodeExpr?特别是对于macrocalls:

julia> ex = :(@foo 1)
:(#= REPL[5]:1 =# @foo 1)

julia> dump(ex)
Expr
  head: Symbol macrocall
  args: Array{Any}((3,))
    1: Symbol @foo
    2: LineNumberNode
      line: Int64 1
      file: Symbol REPL[5]
    3: Int64 1
Run Code Online (Sandbox Code Playgroud)

试过MacroTools.striplines,但是

julia> ex = :(@foo 1+1)
:(#= REPL[7]:1 =# @foo 1 + 1)

julia> MacroTools.striplines(ex) |> dump
Expr
  head: Symbol macrocall
  args: Array{Any}((3,))
    1: Symbol @foo
    2: LineNumberNode
      line: Int64 1
      file: Symbol REPL[7]
    3: Expr
      head: Symbol call
      args: Array{Any}((3,))
        1: Symbol +
        2: Int64 1
        3: Int64 1
Run Code Online (Sandbox Code Playgroud)

我的用例是比较在不同文件中构造的两个不同的exp(所以不同的行号信息).我目前的解决方法是显式写Expr(:macrocall,Symbol("@ foo"),没有,:(1 + 1))这有点冗长.

mig*_*raz 5

内置函数是Base.remove_linenums!

julia> ex = quote begin
   x = 3 
   y = 2
   z = 4
   foo(x) = 3
   end
end
quote
    #= REPL[2]:1 =#
    begin
        #= REPL[2]:2 =#
        x = 3
        #= REPL[2]:3 =#
        y = 2
        #= REPL[2]:4 =#
        z = 4
        #= REPL[2]:5 =#
        foo(x) = begin
                #= REPL[2]:5 =#
                3
        end
    end
end

julia> Base.remove_linenums!(ex)
quote
    begin
        x = 3
        y = 2
        z = 4
        foo(x) = begin
                3
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

感谢 Alex Arslan 提醒我它。