繁体   English   中英

朱莉娅:以循环宏为条件

[英]Julia: Conditional on For Loop Macros

有没有一种简单的方法可以根据用户所拥有的软件包来更改“ for循环头”? 例如,@ progress for很适合在Juno / Atom中添加进度条(刚刚发现!),而我们也有@ simd,@ acc和@parallel这样的东西。 因此,我想在此循环中使用的是根据用户的布尔值或取决于可用性,有条件地放置一堆这些宏。 但是,如果我if isdefined(@progress) @progress for ... elseif accelerate @acc for ... elseif @parallel for ... end进行简单的if isdefined(@progress) @progress for ... elseif accelerate @acc for ... elseif @parallel for ... end或类似的东西,则必须保持相同的粘贴状态。用于循环代码。 有一些更优雅的方法吗? 另外,我可能想组合一些,所以一旦您开始研究可行的组合,最终导致很多代码!

如果未安装软件包,则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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM