Re: Why Return[] does not work?
- To: mathgroup at smc.vnet.net
- Subject: [mg109495] Re: Why Return[] does not work?
- From: Fred Simons <f.h.simons at tue.nl>
- Date: Fri, 30 Apr 2010 05:49:43 -0400 (EDT)
- References: <hr6ihp$2f8$1@smc.vnet.net> <201004290653.CAA18251@smc.vnet.net>
The function Return turns up in this discussion group very regularly. Already in January, 2002 Allan Hayes posted in this group the following summary of the behaviour of Return, that has not lost anything of its importance since then and that answers all questions raised so far: If Return[x] is generated as a value in Do or Scan then x is immediately returned; If Return[x] is generated as an entry in CompoundExpression or as a value of the body of a While or For loop then Return[x] (not x) is immediately returned; If Return[x] is generated as the value of a user-defined function then the function returns x (not Return[x]) Otherwise Return[x] behaves as a ordinary expression. Allan did not include the use of Return to end a Dialog session. In that case, Return should be used as a stand alone command, not e.g. in a compound expression or in a button. My feeling is that the intended purpose of the function Return is to exit from a user-defined function with the argument of Return as the value of the function call. That is a relict from programming languages a long time ago, when indeed it was necessary to use this command to get a value out. There is no reason to use this command in this way nowadays. But it explains e.g. why the result of a compound expression with a Return argument has to be a Return expression. In the following artificial example we have two nested compound expressions: In[63]:= f[___] := Module[{y=0}, y=y+1; If[y>0, y=y+1;Return[y];y=y+10];y=y+100] f[] Out[64]= 2 During the evaluation of the inner compound expression we arrive at Return[y], so we want to have that value of y (that is 2) as the result of the function call. If y was not wrapped in Return, the outer compound expression would be completely evaluated, resulting in the value 102 instead of 2. For the same reason the result of While and For with a Return is wrapped in Return. The fact that Do and Scan behave differently does not seem very very consequent. Further, Return has no effect at all when it turns up in the result of a Table or a Map command, two other loop constructs. I think that Return is not intended for interrupting loops. The documentation states that Return[expr] returns the value expr from a function. Not a very clear description, but in line with the above remarks. As many have already said, for interrupting loops the Catch-Throw construction is much more appropriate. Finally two more examples of 'strange' behaviour: By defining a function with Blank's, we create a user defined rule, and Allan's survey also holds for user defined rules. Consider the immediate assignment a=Return[3]. Evaluation of the right hand side of course returns Return[3]. But since we have created a rule for the symbol a (see OwnValues[a]), calling a gives 3 instead of Return[3]. A pure function does not create a user defined rule, so in pure functions Return will be persistent: In[26]:= f[x_] := Return[x]; g=Return[#]&; {f[a], g[a]} Out[28]= {a,Return[a]} Fred Simons Eindhoven University of Technology
- References:
- Re: Why Return[] does not work?
- From: dh <dh@metrohm.com>
- Re: Why Return[] does not work?