我想要这样的事情:
each[i_, {1,2,3},
Print[i]
]
Run Code Online (Sandbox Code Playgroud)
或者,更一般地说,要解构您循环的列表中的任意内容,例如:
each[{i_, j_}, {{1,10}, {2,20}, {3,30}},
Print[i*j]
]
Run Code Online (Sandbox Code Playgroud)
通常,您希望使用Map或其他纯函数构造,并避免使用副作用的非函数式编程样式.但是这里有一个例子,我认为for-each构造非常有用:
假设我有一个将符号与表达式配对的选项(规则)列表,例如
attrVals = {a -> 7, b -> 8, c -> 9}
Run Code Online (Sandbox Code Playgroud)
现在我想制作一个哈希表,在那里我可以将这些符号明显映射到这些数字.我认为没有比这更清洁的方法了
each[a_ -> v_, attrVals, h[a] = v]
Run Code Online (Sandbox Code Playgroud)
在此示例中,我们转换变量列表:
a = 1;
b = 2;
c = 3;
each[i_, {a,b,c}, i = f[i]]
Run Code Online (Sandbox Code Playgroud)
在上述之后,{a,b,c}应评估为{f [1],f [2],f [3]}.请注意,这意味着如果它是一个列表,那么"each"的第二个参数应该保持不被评估.
如果未评估的表单不是列表,则应评估第二个参数.例如:
each[i_, Rest[{a,b,c}], Print[i]]
Run Code Online (Sandbox Code Playgroud)
那应该打印b和c的值.
附录:要正确地执行每个操作,它应该支持Break []和Continue [].我不确定如何实现它.也许它需要以For,While或Do的方式实现,因为这些是唯一支持Break []和Continue []的循环结构.
到目前为止答案的另一个问题是:他们吃Return [] s.也就是说,如果您在函数中使用ForEach循环并希望从循环内的函数返回,则不能.在ForEach循环中发出Return似乎像Continue []一样工作.这只是(等待它)把我扔了一圈.
使用可选的命名参数定义函数的最佳/规范方法是什么?为了使混凝土,让我们创建一个函数foo与命名的参数a,b和c,其默认为1,2,3,分别.为了比较,这是一个foo带位置参数的版本:
foo[a_:1, b_:2, c_:3] := bar[a,b,c]
Run Code Online (Sandbox Code Playgroud)
以下是命名参数版本的示例输入和输出foo:
foo[] --> bar[1,2,3]
foo[b->7] --> bar[1,7,3]
foo[a->6, b->7, c->8] --> bar[6,7,8]
Run Code Online (Sandbox Code Playgroud)
当然,在命名参数之前使用位置参数也很容易.
内置的实现OptionValue包含了一些魔术
OptionValue[name]相当于OptionValue[f, name],其中出现f的转换规则的左侧的头部 在哪里OptionValue[name].
有没有人知道如何实现类似的东西Options,即实现一个autoOptions[]可以解决为autoOptions[]出现的转换规则左侧的符号定义的选项?为清楚起见,我正在寻找的是一种方法
Options[foo]={bar->1};
foo[OptionsPattern[]]:=autoOptions[]
foo[]
Run Code Online (Sandbox Code Playgroud)
产量 {bar->1}
最终的目标是在这个问题中做出类似的事情,而不必改变定义的RHS.