 
 
 
 
 
 
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

