patch for $addrow needed?



--Alt-Boundary-27852.9751671
Content-type: text/plain; charset=US-ASCII
Content-transfer-encoding: 7BIT
Content-description: Mail message body

Hi all,
I found, that src/comm2.lisp/$addrow can produce sideeffects.

(%i1) m1:matrix([1,2,3],[4,5,6]);
                                  [ 1  2  3 ]
(%o1)                             [         ]
                                  [ 4  5  6 ]
(%i2) m2:addrow(m1,[7,8,9]);
                                  [ 1  2  3 ]
                                  [         ]
(%o2)                             [ 4  5  6 ]
                                  [         ]
                                  [ 7  8  9 ]
(%i3) m2[1][1]:0$
(%i4) m1;
                                  [ 0  2  3 ]
(%o4)                             [         ]
                                  [ 4  5  6 ]

Is this intended?

With $addcol there isn't such a problem.

(%i5) m3:addcol(m1,[4,7]);
                                [ 0  2  3  4 ]
(%o5)                           [            ]
                                [ 4  5  6  7 ]
(%i6) m3[1][1]:1$
(%i7) m1;
                                  [ 0  2  3 ]
(%o7)                             [         ]
                                  [ 4  5  6 ]

In src/comm2.lisp I found at first sight, that $addcol uses 
matrix.lisp/$transpose and $transpose does consing via 
matrix.lisp/mxc.

I suggest a small patch for $addrow:

(defmfun $addrow n
  (cond ((= n 0) (wna-err '$addrow))
        ((not ($matrixp (arg 1))) (merror "First argument to 
`addrow' must be a matrix"))
        ((= n 1) (arg 1))

        ;;(t (do ((i 2 (f1+ i)) (m (arg 1))) ((> i n) m);; old
        (t (do ((i 2 (f1+ i)) (m (copy-tree (arg 1)))) ((> i n) m)
                                 ;; patch: copying the matrix
             (setq m (addrow m (arg i)))))))

What do you think?

Volker

--Alt-Boundary-27852.9751671
Content-type: text/html; charset=US-ASCII
Content-transfer-encoding: 7BIT
Content-description: Mail message body

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">;
<html  xmlns="http://www.w3.org/1999/xhtml"; xml:lang="en" lang="en"><head>
<title></title>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<meta http-equiv="Content-Style-Type" content="text/css"/>
</head>
<body>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">Hi all,</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">I found, that src/comm2.lisp/$addrow can produce sideeffects.</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i1) m1:matrix([1,2,3],[4,5,6]);</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [ 1&#160; 2&#160; 3 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%o1)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [ 4&#160; 5&#160; 6 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i2) m2:addrow(m1,[7,8,9]);</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [ 1&#160; 2&#160; 3 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%o2)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [ 4&#160; 5&#160; 6 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [ 7&#160; 8&#160; 9 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i3) m2[1][1]:0$</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i4) m1;</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [ 0&#160; 2&#160; 3 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%o4)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [ 4&#160; 5&#160; 6 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">Is this intended?</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">With $addcol there isn't such a problem.</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i5) m3:addcol(m1,[4,7]);</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [ 0&#160; 2&#160; 3&#160; 4 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%o5)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [ 4&#160; 5&#160; 6&#160; 7 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i6) m3[1][1]:1$</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i7) m1;</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [ 0&#160; 2&#160; 3 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%o7)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [ 4&#160; 5&#160; 6 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">In src/comm2.lisp I found at first sight, that $addcol uses 
matrix.lisp/$transpose and $transpose does consing via 
matrix.lisp/mxc.</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">I suggest a small patch for $addrow:</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(defmfun $addrow n</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160; (cond ((= n 0) (wna-err '$addrow))</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160; ((not ($matrixp (arg 1))) (merror &quot;First argument to 
`addrow' must be a matrix&quot;))</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160; ((= n 1) (arg 1))</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160; ;;(t (do ((i 2 (f1+ i)) (m (arg 1))) ((&gt; i n) m);; old</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160; (t (do ((i 2 (f1+ i)) (m (copy-tree (arg 1)))) ((&gt; i n) m)</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ;; patch: copying the matrix</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (setq m (addrow m (arg i)))))))</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">What do you think?</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">Volker</span></font></div>
</body>
</html>

--Alt-Boundary-27852.9751671--