【发布时间】:2011-12-16 12:43:37
【问题描述】:
我并不完全清楚 Return[] 的工作原理。
文档说:
Return[expr]从函数返回值 expr。
但在 Mathematica 中并不清楚使用模式和Set(Delayed) 定义的“函数”的边界在哪里。系统只是应用替换规则,直到不再需要更改为止。
考虑以下示例:
a := (Module[{}, Return[0]; 1]; 2)
a
(* 0 *)
我并不完全清楚为什么Return 是从a 爆发出来的,而不是从Module 或CompoundExpression 之一爆发出来的。
以下不起作用,只返回Return 表达式。它让我想起了Unevaluated 的处理方式。
(Module[{}, Return[0]; 1]; 2)
(* Return[0] *)
如果我们再增加一层定义,Return的效果就到此为止了:
b := (a; 3)
(* 3 *)
为什么这三个输入会给出不同的结果?决定Return 准确突破的一般规则是什么?
答案在于完全理解评估过程。
是否有人愿意阐明这一点,也许可以通过指向文档中明确这一点的部分的指针来说明这一点?
【问题讨论】:
-
注意
Return的行为有changed from one version to another.我自己一般尽量避免使用。 -
@Mr.W 哇,如果它的行为即使在次要版本之间也会发生变化,那么确实最好避免!
-
@Mr.Wizard, Szabolcs 就我个人而言,我不认为这个特别的观察是反对使用
Return的有力证据,因为它只是新功能的添加 (Fold),并且没有旧代码被破坏(另请参阅我的回答下方的评论)。 -
@Leonid 我似乎还记得至少另一种情况,我想在 Mathgroup 上,每个版本的 Return 行为不同。这听起来你很陌生吗?另外,我没有考虑太多,但改变不能重新:折叠破坏现有的 v7 代码吗?这可能是 Return 的一种奇怪用法,但不会像可变的 PatternTest 函数那样奇怪...... ;-)
-
@Mr.Wizard 好吧,我想一个 可以 构造一个在新版本中会“损坏”的代码示例,但我很难想象它会比你提到的方法更不反常(实际上,我确实建设性地使用了几次)。
标签: function-construction evaluation core-language faq