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)