为什么这些半等价的宏之一会失败?

Why does one of these semingly equivalent macros fail?

考虑这两个宏定义:

macro createTest1()
    quote
        function test(a = false)
            a
        end
    end |> esc
end

macro createTest2()
    args = :(a = false)
    quote
        function test($args)
            a
        end
    end |> esc
end

根据内置的 Julia 工具,它们在扩展时应该计算相同的东西:

println(@macroexpand @createTest1)
begin
    function test(a=false)
        a
    end
end
println(@macroexpand @createTest2)
begin
    function test(a = false)
        a
    end
end

尝试计算第二个宏时仍然出现解析错误:

@createTest2
ERROR: LoadError: syntax: "a = false" is not a valid function argument name

它是第二个参数列表中的space。但是,这应该是正确的 Julia 语法。我的猜测是,与第一个相比,它将第二个参数列表解释为另一个 Julia 结构。如果是这种情况,我该如何解决?

第二个宏失败的原因如我上面的问题所述。它在打印时看起来是正确的,但是 args 没有正确定义并且 Julia 将其解释为不允许的表达式。解决方案是根据函数参数的规则来定义 args。以下代码按预期执行:

  macro createTest2()
    args = Expr(:kw, :x, false)
    quote
        function test($(args))
            a
        end
    end |> esc
  end