考虑以下两个宏定义:
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结构。如果是这种情况,我该如何解决?
答案 0 :(得分:0)
第二个宏失败的原因如上所述。打印时看起来正确,但是args定义不正确,Julia将其解释为不允许的表达式。解决方案是改为根据函数参数的规则定义args。以下代码按预期执行:
macro createTest2()
args = Expr(:kw, :x, false)
quote
function test($(args))
a
end
end |> esc
end