RE: The uses of Condition (/;)
- To: mathgroup at smc.vnet.net
- Subject: [mg82937] RE: [mg82926] The uses of Condition (/;)
- From: "Ingolf Dahl" <ingolf.dahl at telia.com>
- Date: Sun, 4 Nov 2007 06:06:32 -0500 (EST)
- References: <200711030831.DAA19563@smc.vnet.net>
I think the real example in case C should be h1[x_] := Module[{}, (Print["def"]; x) /; (Print["cond"]; x > 5)] because your h[x_] expression is interpreted as h[x_] := Module[{}, Print["def"]; (x /; (Print["cond"]; x > 5))] which does not correspond to the case C. It instead corresponds to D. pattern := Module[{}, expr1; (definition /; condition)] This leads us to an answer to your question. We define a new pattern, a modification of pattern B: E. pattern := (expr1; (definition /; condition)) with the example g1[x_] := (Print["expr1"]; ((Print["def"]; x) /; (Print["cond"]; x > 5))) In[8]:= g1[0] During evaluation of In[8]:= expr1 During evaluation of In[8]:= cond Out[8]= g1[0] This function behaves similar to the D function, and we see that Module is just a wrapper. Module here is useful if we want to share local variables between the definition and the expression, so that we can transfer sub results and do not have to repeat calculations. I do not see how to modify A to get the same kind of evaluation as with the case E. See also the MathGroup discussion about precedence of operators earlier this week. Best regards Ingolf Dahl > -----Original Message----- > From: Szabolcs Horv=E1t [mailto:szhorvat at gmail.com] > Sent: den 3 november 2007 09:32 > To: mathgroup at smc.vnet.net > Subject: [mg82926] The uses of Condition (/;) > > > According to the documentation, /; can be used in three > different ways, illustrated below: > > A. pattern /; condition = definition > > B. pattern := definition /; condition > > C. pattern := Module[{}, definition /; condition] > > Real examples for testing: > > f[x_] /; (Print["cond"]; x > 5) := (Print["def"]; x) > > g[x_] := (Print["def"]; x) /; (Print["cond"]; x > 5) > > h[x_] := Module[{}, Print["def"]; x /; (Print["cond"]; x > 5)] > > Usage C differs from A and B in that 'definition' is always > evaluated, > and it is evaluated before 'condition'. But I cannot see *any* > difference in meaning between A and B. > > Is B completely redundant? Could someone show an example > where an A type and a B type definition behave differently? > Is there any situation where B can be used, but A cannot? (A > is more general: it can be used with any pattern, while B is > restricted to use with SetDelayed and similar functions.) Is > B provided solely as a more readable syntax? > > Szabolcs > > P.S. Unfortunately usage C is "hidden" in the docs. IMO, since it's > *meaning* (and not only syntax) is different from that of A > and B, it deserves a more prominent place in the docs. > >
- References:
- The uses of Condition (/;)
- From: Szabolcs Horvát <szhorvat@gmail.com>
- The uses of Condition (/;)