使用Julia';宏内部的外部命令插值?

使用Julia';宏内部的外部命令插值?,julia,Julia,我一直在尝试编写一个Julia宏,它接受Cmd对象并在循环中运行它们。关键是我想在命令中使用局部循环变量进行插值。我将编写一个函数并使用eval(),但eval()使用全局范围,因此无法查看局部循环变量 下面是一个简单的示例,演示了字符串插值的工作原理,但命令插值失败: macro runcmd(cmdExpr) quote for i in 1:2 println("i: $i") run($cmdExpr)

我一直在尝试编写一个Julia宏,它接受Cmd对象并在循环中运行它们。关键是我想在命令中使用局部循环变量进行插值。我将编写一个函数并使用eval(),但eval()使用全局范围,因此无法查看局部循环变量

下面是一个简单的示例,演示了字符串插值的工作原理,但命令插值失败:

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谢谢!我读了宏观部分,然后浏览了卫生部分,因为当时我不明白它是如何应用的。现在我明白发生了什么了。这很微妙!我敢肯定,您提出的任何手动改进都会受到欢迎。我现在明白了,我的意思是,宏扩展器将我设置为局部变量,以防止名称空间冲突。谢谢你的回答和链接!