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