julia - 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
有没有办法触发向量内的转义,以便可以访问变量或者我在这里错过了一些明显的东西?
解决方案
推荐阅读
- php - PHP CURL 不适用于多维数组
- regex - 提取最后一个单词/文本多个匹配的logstash
- javascript - 导入冲突两个模块反应原生
- reactjs - 带有 react-redux-firebase 的 react-hook-form 不起作用
- android - 如何处理android webview中的firebase动态链接
- python - 在不同版本的 Python 中使用 pip 安装包
- c++ - 将一系列数字映射到 cpp 中的值的简单方法
- angular-material - 在 Angular 8 的 MatIcon 中使用 MatTooltip 导致问题
- python - 'class MyClass:' 和 'class MyClass():' 之间的区别
- javascript - 这个转义函数有什么作用?