我对宏的理解是它的参数可以是文字,符号或表达式。但是我发现当我有递归宏时,它还会更多吗?或者,也许我没有正确理解宏评估,您可以帮助我。例如在这个测试宏中,它将符号向量转换为字符串向量
macro symbolstostr(arr)
if in(:head, fieldnames(typeof(arr))) && arr.head == :vect
println("Expr:$(arr)")
v = arr.args
elseif typeof(arr) == Vector{Any}
println("Vector, Not Expression:$(arr)")
v = arr
end
if isempty(v)
:([])
else
str = string(v[1])
val = v[2:end]
:(append!(copy($([str])), @symbolstostr($val)))
end
end
如果我用以下方式调用它:
println(@symbolstostr([x, y, z]))
它打印
Expr:[x, y, z]
Vector, Not Expression:Any[:y, :z]
Vector, Not Expression:Any[:z]
Vector, Not Expression:Any[]
["x", "y", "z"]
如您所见,对于第一个调用,arr
是一个Expr
,但是对于递归调用@symbolstostr
(调用站点是宏的最后一行),{ {1}}实际上是typeof(arr)
。我认为所有对宏的输入都将转换为表达式,文字或符号。