For loop 朱莉娅:以For循环宏为条件

For loop 朱莉娅:以For循环宏为条件,for-loop,metaprogramming,julia,For Loop,Metaprogramming,Julia,是否有一种简单的方法可以根据用户拥有的包更改“for循环头”?例如,@progress For适合在Juno/Atom(刚刚发现!)中添加进度条,而我们也有类似于@simd、@acc和@parallel的东西。因此,我希望在这个循环中,根据用户的布尔值或可用性,有条件地放置一组宏。但是,如果我做一个简单的 如果已定义(@progress) @进展为。。。 埃尔塞夫加速 @acc代表。。。 埃尔塞夫 @平行于。。。 结束 或者诸如此类的东西,我必须继续粘贴相同的for循环代码。有没有更优雅的方

是否有一种简单的方法可以根据用户拥有的包更改“for循环头”?例如,@progress For适合在Juno/Atom(刚刚发现!)中添加进度条,而我们也有类似于@simd、@acc和@parallel的东西。因此,我希望在这个循环中,根据用户的布尔值或可用性,有条件地放置一组宏。但是,如果我做一个简单的

如果已定义(@progress)
@进展为。。。
埃尔塞夫加速
@acc代表。。。
埃尔塞夫
@平行于。。。
结束

或者诸如此类的东西,我必须继续粘贴相同的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)

您可以轻松地将if、elseif链接成一个宏,可能称为
@myfor
或其他什么。然后在定义宏时只编写一次代码。也就是说,我不确定应用所有可用于循环宏的方法是否是“一刀切”的解决方案。我个人喜欢更明确,在循环前面写出宏,我想把它们应用到写出来的问题是,它们会有很多,还有很多不同的组合。我正在写一个有限元解算器,所以我想做的是有布尔关键字参数,用于判断它是否并行,是否要打开进度条,等等,并且所有正确的宏都在循环中。有没有一种方法可以将其改为使用布尔值?布尔值来自传递到函数中的关键字参数,用于告诉函数将其他宏放入循环中。其中一些是因为软件包依赖性(我喜欢这一个自动做到这一点!),但其他的只是选择。但由于宏是在编译时运行的,我不太确定它编译时会做什么。你是说使用运行时值来确定宏生成的代码?不您不能这样做,因为这些值在编译时显然不可用。但是,您可以根据某个值制作一个宏来创建if/then块。我把它作为练习;)文档错误:
help?>Pkg.installed installed(Pkg)->Void | VersionNumber如果安装了Pkg,请返回已安装的版本号,否则返回**nothing**,但如果未安装,则返回错误。因此,如果包不在元数据中,则返回错误,但如果包在元数据中且未安装,则返回
nothing
。我更新了宏以反映这一点。似乎应该更改
Pkg.installed
方法。。。