Special thanks!
- To: mathgroup at smc.vnet.net
- Subject: [mg23240] Special thanks!
- From: Jack Goldberg <jackgold at math.lsa.umich.edu>
- Date: Sat, 29 Apr 2000 22:04:48 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi Group!
I am indebted to David Parks, Carl Woll, Wijnand Schepens and Preston
Nichols for their clear and thoughtful responses to my post, wherein I
asked for an explanation of this simple (?) code:
OrderedUnion2[li_] := Module[ {i},
i[n_] := ( i[n] = Null; n );
i /@ li ]
I know that there were others besides myself who were puzzled by line 2,
the definition of i[n_]. I now understand my confusion and in the hope
that this helps others, I offer it here.
An expression such as
fnt[x_] := (expr1; expr2; expr3);
when CALLED evaluates each expression inside the () but returns only
expr3. In our case, what is returned is n, the argument of i[n].
Once i[n_] is called say with n = 2.3 then i[2.3] = Null is constructed
AND 2.3 is returned. When (and if) i[2.3] is encountered again, Mathematica
searches its definition list (the downvalues for i and finds i[2.3]=Null
before it finds i[n_] := (.....) because i[2.3] is more specific than the
general formula for i[n_]. So the second line of the code will not "fire"
when the argument of i is 2.3 except (as noted) the first time 2.3 is
seen. For example,
OrderedList2[{1,1,1,1,1,1}]
calls line 2 only once, the first time it sees i[1]. The last 5 times
it sees i[1] it uses the definition i[1]=Null which it constructed BUT
DID NOT return the first time and only time i[n_] in line 2 is called.
!! In other words i[1] = Null in line 2 is NOT called ever again!!
At the risk of "beating a dead horse", here is a modification of
Woll/Parks code that convinced me.
test[li_] := Block[ {i, j=0},
i[n_] :=(i[n]=Null; j=j+1);
i/@li
]
This modification enables us to counts the number of times i[n_] is
called. We can see that i[n_] is called only once for the list
{1,1,1,1,1,1,1} but 6 times for the list {3,2,99,8,3,1}.
If this explanation is wrong then I really don't know whats going on :-)
Jack