MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

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.
>
>




  • Prev by Date: Re: [Q] Nonlinear Fitting in symbolic Integration ..?
  • Next by Date: RE: The uses of Condition (/;). second thoght
  • Previous by thread: The uses of Condition (/;)
  • Next by thread: RE: The uses of Condition (/;). second thoght