使用Julia';宏内部的外部命令插值?
我一直在尝试编写一个Julia宏,它接受Cmd对象并在循环中运行它们。关键是我想在命令中使用局部循环变量进行插值。我将编写一个函数并使用eval(),但eval()使用全局范围,因此无法查看局部循环变量 下面是一个简单的示例,演示了字符串插值的工作原理,但命令插值失败:使用Julia';宏内部的外部命令插值?,julia,Julia,我一直在尝试编写一个Julia宏,它接受Cmd对象并在循环中运行它们。关键是我想在命令中使用局部循环变量进行插值。我将编写一个函数并使用eval(),但eval()使用全局范围,因此无法查看局部循环变量 下面是一个简单的示例,演示了字符串插值的工作原理,但命令插值失败: macro runcmd(cmdExpr) quote for i in 1:2 println("i: $i") run($cmdExpr)
macro runcmd(cmdExpr)
quote
for i in 1:2
println("i: $i")
run($cmdExpr)
end
end
end
@runcmd(`echo $i`)
输出
i: 1
ERROR: i not defined
in anonymous at none:5
如果我展开宏,就会得到
quote # none, line 3:
for #261#i = 1:2 # line 4:
println("i: $#261#i") # line 5:
run(Base.cmd_gen((("echo",),(i,))))
end
end
我猜cmd#u gen参数对I的引用中缺少的#261#部分与问题有关,但我不确定。你是对的,问题是因为索引
I
和echo$I
中对它的引用不匹配。解决此问题的一个简单方法是避开索引中使用的i
:
macro runcmd(cmdExpr)
quote
for $(esc(:i)) in 1:2
println("i: $i")
run($cmdExpr)
end
end
end
然后我们得到:
julia> @runcmd(`echo $i`)
i: 1
1
i: 2
2
朱莉娅家里还有更多的讨论。只是好奇。。。您希望这样做的用例和/或动机是什么?您是否阅读了手册的宏观卫生部分?您的
引号中的i
在生成的代码中不会以i
的形式出现。@rickhg12hs我正在运行许多shell命令,每个命令都在一组可能的数据集上,这些命令需要引用数据集名称。@iaindenning谢谢!我读了宏观部分,然后浏览了卫生部分,因为当时我不明白它是如何应用的。现在我明白发生了什么了。这很微妙!我敢肯定,您提出的任何手动改进都会受到欢迎。我现在明白了,我的意思是,宏扩展器将我设置为局部变量,以防止名称空间冲突。谢谢你的回答和链接!