【发布时间】:2008-10-01 23:25:43
【问题描述】:
我想要这样的东西:
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[] 和 Continue[] 的循环结构。
到目前为止,答案还有另一个问题:他们吃Return[]s。也就是说,如果您在函数中使用 ForEach 循环并希望从循环内从函数返回,则不能。在 ForEach 循环内发出 Return 似乎像Continue[] 一样工作。这只是(等待它)让我陷入了循环。
【问题讨论】:
标签: loops language-features wolfram-mathematica