首页 > 解决方案 > Julia 宏观卫生的载体

问题描述

我在 Julia 中使用宏时偶然发现了一个奇怪的行为。我想转义向量中的所有元素并使用 map 函数进行处理。当我将结果存储回向量中时,似乎在宏调用之后不对转义函数进行评估,但是当映射函数的输出存储到变量中时,可以看到预期的行为。

存储在向量中的元素看起来类似于单个转义符号。

input = [:a, :b]
escaped_input = map(x -> esc(x),input)
println(escaped_input) 
>>> Expr[:($(Expr(:escape, :a))), :($(Expr(:escape, :b)))]

println(esc(:a))
>>> :($(Expr(:escape, :a)))

但是,当在引用中的宏内访问元素时,转义函数似乎没有被执行:

a = 1
b = 2

macro escapeVector(testVec...)
    escapedVec = map(x -> esc(x), collect(testVec))
    quote
        map(x -> println(x), $escapedVec)
        println($escapedVec)
    end
end

macro escapeVars(testVec...)
    esc_a, esc_b = map(x -> esc(x), collect(testVec))
    quote
        println($esc_a)
        println($esc_b)
    end
end

@escapeVector a b
@escapeVars a b

此代码产生以下输出:

>>> $(Expr(:escape, :a))
>>> $(Expr(:escape, :b))
>>> Expr[:($(Expr(:escape, :a))), :($(Expr(:escape, :b)))]
>>> 1
>>> 2

有没有办法触发向量内的转义,以便可以访问变量或者我在这里错过了一些明显的东西?

标签: juliaescapingmetaprogramming

解决方案


推荐阅读