【发布时间】:2018-10-29 00:28:58
【问题描述】:
我是元编程的菜鸟,所以也许我不理解这一点。我认为 Base.Cartesian 中的 @nloops 宏的目的是在维度未知的情况下,可以编写任意数量的嵌套 for 循环。在该模块的文档中,给出了以下示例:
@nloops 3 i A begin
s += @nref 3 A i
end
计算结果为
for i_3 = 1:size(A,3)
for i_2 = 1:size(A,2)
for i_1 = 1:size(A,1)
s += A[i_1,i_2,i_3]
end
end
end
在这里,数字 3 是先验已知的。然而,出于我的目的,并且出于我认为创建 nloops 的目的,嵌套级别的数量并不能提前知道。所以我无法对整数 3 进行硬编码。即使在文档中,也有说明:
@nloops 的(基本)语法如下:
- 第一个参数必须是指定循环次数的整数(不是变量)。
...
如果我将一个整数值(例如传递给函数的数组的维度)分配给某个变量,则 nloops 宏不再起作用:
b = 3
@nloops b i A begin
s += @nref b A i
end
这会返回一个错误:
ERROR: LoadError: MethodError: no method matching _nloops(::Symbol, ::Symbol, ::Symbol, ::Expr)
Closest candidates are:
_nloops(::Int64, ::Symbol, ::Symbol, ::Expr...) at cartesian.jl:43
...
我不知道如何让 nloops 将 b 变量评估为整数而不是符号。我查看了文档并尝试了eval 和其他函数和宏的各种迭代,但它被解释为符号或Expr。写这个的正确的朱利安方式是什么?
【问题讨论】:
标签: macros julia metaprogramming