[Date Index]
[Thread Index]
[Author Index]
Re: Conditionals with multiple tests?(2)
*To*: mathgroup at smc.vnet.net
*Subject*: [mg24170] Re: Conditionals with multiple tests?(2)
*From*: "Allan Hayes" <hay at haystack.demon.co.uk>
*Date*: Wed, 28 Jun 2000 22:50:51 -0400 (EDT)
*References*: <8j9dvs$523@smc.vnet.net> <8jc62p$d84@smc.vnet.net>
*Sender*: owner-wri-mathgroup at wolfram.com
Re the role of CompoundExpression[e1,e2, ..., en]. I Copy from my reply to a
personal message from A. E. Siegman:
For example
c = Which[True, a=2; b=3; 2 a b, . . . ]
Will assign to c the value of Which[True, a=2; b=3; 2 a b, . . . ]; which,
because of True, will be the value of
a=2; b=3; 2 a b.
(the FullForm of a=2; b=3; 2 a b is CompoundExpression[ a=2, b=3, 2 a b]).
The value of an expression e is what it is eventually transformed into by
the evaluation process in the presence of all the currently stored
assignments.
In our case, a=2; b=3; 2 a b evaluates via the following steps
- evaluate a=2, giving
CompoundExpression[ 2, b=3, 2 a b] and storing the assignment a =2;
- evaluate b=3, giving
CompoundExpression[ 2, 3, 2 a b] and storing the assignment b =3
- evaluate 2 a b uses the previous stored assignments to a and b,
giving
CompoundExpression[ 2, 3, 12]
- change to 12 (the value of the original a=2; b=3; 2 a b )
However, you are more interested in the assignments for p1,p2 ..stored
during the evaluation.
**note added for this posting **:
There is an extra bit to the evaluation in general: After the entries in
CompountExpression[e1, e2, ,en] have been evaluated to give
CompountExpression[e1*, e2*, ,en*] , this changes to en* AND THEN en* is
put through the evaluation process to give en**. This shows up in the
following comparison
Clear[a,x]
a; {x, x = 3}
{3, 3}
Clear[x]
{x, x = 3}
{x, 3}
%
{3, 3}
--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565
"Allan Hayes" <hay at haystack.demon.co.uk> wrote in message
news:8jc62p$d84 at smc.vnet.net...
> "A. E. Siegman" <siegman at stanford.edu> wrote in message
> news:8j9dvs$523 at smc.vnet.net...
> > Let's say I want to assign values to three variables p1, p2, p3 that
> > will depend on five different (and nonoverlapping) tests test1 to test
5.
> >
> > One way to do this is obviously
> >
> > p1 = Which[test1, value11, test2, value12, . . . ]
> > p2 = Which[test1, value21, test2, value22, . . . ]
> > p3 = Which[test1, value31, test2, value32, . . . ]
> >
> > But a more compact and (for me anyway) neater approach is
> >
> > Which[test1, p1=value11; p2=value21; p3=value31,
> > test2, p1=value21; p2=value22; p3=value32,
> > test3, . . .
> > test4, . . .
> > test5, . . . ]
> >
> > Is this form legal? That is, can one use:
> >
> > Which[test1, expr1, test2, expr2, . . .]
> >
> > where expr1, expr2, . . . may be compound expressions?
>
>
> A compound expression is a perfectly legitimate expression, so no problem
> there.
>
> Assuming that no definitions produce side effects.
> If all of your tests give either True or False and at least one gives
True,
> then the two ways will be equivalent. But otherwise they may not be
> equivalent:
>
> Which[test1, v1, test2, v2 ... testn, vn] seems to evaluate as follows.
> For i = 1,2,...in turn
> ? evaluate testi to testi*
> ? if testi* is True return the value of vi
> ? if testi* is False delete testi and vi
> ? if testi* is neither True nor False return the current Which[testi*,
> vi..]
>
> ? if Which[] is reached return Null.
>
> Check
>
> Clear["`*"]
> F = False; T = True; U = vU; a = va; b = vb;
>
> {Which[F,a,T,b],
> Which[F,a,U,b,T,b],
> Which[F,a,F,b],
> Which[]
> }
>
> {vb, Which[vU, b, T, b], Null, Null}
>
>
> --
> Allan
> ---------------------
> Allan Hayes
> Mathematica Training and Consulting
> Leicester UK
> www.haystack.demon.co.uk
> hay at haystack.demon.co.uk
> Voice: +44 (0)116 271 4198
> Fax: +44 (0)870 164 0565
>
> "A. E. Siegman" <siegman at stanford.edu> wrote in message
> news:8j9dvs$523 at smc.vnet.net...
> > Let's say I want to assign values to three variables p1, p2, p3 that
> > will depend on five different (and nonoverlapping) tests test1 to test
5.
> >
> > One way to do this is obviously
> >
> > p1 = Which[test1, value11, test2, value12, . . . ]
> > p2 = Which[test1, value21, test2, value22, . . . ]
> > p3 = Which[test1, value31, test2, value32, . . . ]
> >
> > But a more compact and (for me anyway) neater approach is
> >
> > Which[test1, p1=value11; p2=value21; p3=value31,
> > test2, p1=value21; p2=value22; p3=value32,
> > test3, . . .
> > test4, . . .
> > test5, . . . ]
> >
> > Is this form legal? That is, can one use:
> >
> > Which[test1, expr1, test2, expr2, . . .]
> >
> > where expr1, expr2, . . . may be compound expressions?
> >
> > (I would say that The Mathematica Book is not at all clear on this
> > point, as regards either Which[] or If[].)
> >
> > If not, is there a legal way to implement the basic objective?
> >
>
>
>
Prev by Date:
**Removing In and Out Labels in all Open Notebooks [revisited]**
Next by Date:
**Re: Export to Word2000**
Previous by thread:
**Removing In and Out Labels in all Open Notebooks [revisited]**
Next by thread:
**mathlink problems**
| |