Self destructing definitions
- To: mathgroup at yoda.physics.unc.edu
 - Subject: Self destructing definitions
 - From: LELMA at basin.crc.uno.edu
 - Date: Mon, 9 Mar 1992 14:14 CST
 
A colleague of mine is having the following problem with definitions that seem
to overwrite each other:
In[1]:=
     rowOp[A_?MatrixQ,c_opcode] :=
	 (A[[c[[2]]]] = A[[c[[2]]]] c[[3]]
	/; c[[1]] == 1)
In[2]:=	
     rowOp[A_?MatrixQ,c_opcode] :=
	(A[[c[[2]]]] = A[[c[[2]]]] + c[[3]] A[[c[[4]]]]
		/; c[[1]] == 3)
(*  We now find the first definition has been overwritten by the second. *)
In[3]:= ?rowOp
Out[3]=
    rowOp
    rowOp/: rowOp[(A_)?MatrixQ, c_opcode] := 
 
       A[[c[[2]]]] = 
 
        A[[c[[2]]]] + c[[3]] A[[c[[4]]]] /; c[[1]] == 3
(*   If the first definition is now repeated, it in turn overwrites the second 
definition.  *)
In[4]:=  rowOp[A_?MatrixQ,c_opcode] :=
	 (A[[c[[2]]]] = A[[c[[2]]]] c[[3]]
		/; c[[1]] == 1)
In[5]:=  ?rowOp
Out[5]=  rowOp
       rowOp/: rowOp[(A_)?MatrixQ, c_opcode] := 
        A[[c[[2]]]] = A[[c[[2]]]] c[[3]] /; c[[1]] == 1
  In the original source of this problem, the function rowOp had the 
attribute  HoldFirst.  The above shows that this is not needed to produce the 
problem.  Changing the name of the pattern c to something else in one or the 
other definition allows both to coexist. 
What's going wrong?
Any help would be appreciated,  Thanks.
Lew Lefton
Department of Mathematics
University of New Orleans
New Orleans, Louisiana  70148
Phone:          (504) 286-6331
E-mail address:  lelma at uno.edu  (OR lelma at uno.bitnet)