MathGroup Archive 2000

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

Search the Archive

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