递归宏:为什么输入的arg类型不是表达式,符号或文字

时间:2018-11-27 18:41:21

标签: julia

我对宏的理解是它的参数可以是文字,符号或表达式。但是我发现当我有递归宏时,它还会更多吗?或者,也许我没有正确理解宏评估,您可以帮助我。例如在这个测试宏中,它将符号向量转换为字符串向量

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)。我认为所有对宏的输入都将转换为表达式,文字或符号。

0 个答案:

没有答案