Julia:以 For 循环宏为条件

Julia: Conditional on For Loop Macros

有没有一种简单的方法可以根据用户拥有的软件包更改 "for loop header"?例如,@progress for 很适合在 Juno/Atom 中添加进度条(刚刚发现!),而我们也有 @simd、@acc 和 @parallel 之类的东西。所以我想在这个循环中有条件地放置一堆这些宏,给定一个来自用户的布尔值或取决于可用性。但是,如果我做一个简单的 if isdefined(@progress) @progress for ... elseif accelerate @acc for ... elseif @parallel for ... end 或类似的东西,我将不得不继续粘贴相同的 for 循环代码。有没有更优雅的方法来做到这一点?另外,我可能想组合一些,所以一旦你开始寻找可行的组合,最终会变成大量代码!

如果未安装包,Pkg.installed 方法将出错。它接受一个字符串,并在 catch 块中用另一种可能性返回该行之后的装饰表达式对这种事情有效:

macro optional_something(pkg, expr)
    try
        Pkg.installed(string(pkg)) == nothing && return expr
        esc(quote
            @time $expr
        end)
    catch
        expr
    end
end

# this won't add the macro @time
@optional_something XXX rand(1000)    

# this will
@optional_something Plots rand(1000)