为什么这些半等价的宏之一会失败?
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
考虑这两个宏定义:
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