我想要这样的东西:
each[i_, {1,2,3},
Print[i]
]
或者,更一般地,解构您正在循环的列表中的任意内容,例如:
each[{i_, j_}, {{1,10}, {2,20}, {3,30}},
Print[i*j]
]
通常,您希望使用Map
或其他纯函数式构造,并避免使用副作用的非函数式编程风格。但这里有一个例子,我认为 for-each 结构非常有用:
假设我有一个将符号与表达式配对的选项(规则)列表,例如
attrVals = {a -> 7, b -> 8, c -> 9}
现在我想制作一个哈希表,在其中将这些符号明显映射到这些数字。我认为没有比这更清洁的方法了
each[a_ -> v_, attrVals, h[a] = v]
额外的测试用例
在这个例子中,我们转换了一个变量列表:
a = 1;
b = 2;
c = 3;
each[i_, {a,b,c}, i = f[i]]
在上述之后,{a,b,c}
应评估为{f[1],f[2],f[3]}
。请注意,这意味着each
如果它是一个列表,则它的第二个参数应该不被评估。
如果未计算的形式不是列表,它应该计算第二个参数。例如:
each[i_, Rest[{a,b,c}], Print[i]]
那应该打印 和 的b
值c
。
附录:为了正确地做for-each,它应该支持Break[]
和Continue[]
。我不确定如何实现。也许它需要以某种方式用 For、While 或 Do 来实现,因为这些是唯一支持Break[]
and的循环结构Continue[]
。
到目前为止,答案的另一个问题是:他们吃Return[]
s。也就是说,如果您在函数中使用 ForEach 循环并希望从循环内从函数返回,则不能。在 ForEach 循环内发出 Return 似乎像Continue[]
. 这只是(等待它)让我陷入了循环。