为什么这些大约相等的宏之一失败了?

时间:2019-06-26 14:26:44

标签: macros julia metaprogramming

考虑以下两个宏定义:

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

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

1 个答案:

答案 0 :(得分:0)

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

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