COPYLIST(L) question



do L:?copy(M).

The lisp program COPY copies sublists. This is a problem only if
the (sub) structures you are copying are not lisp lists. All
the usual macsyma structures are lists.   (Newsimp uses hashtables,
which would make this, as well as Stavros' fix).


Stavros Macrakis wrote:

>>I have a problem with creating a copy of a list, which does 
>>not change when the original is changed. Is it possible and 
>>how to do this?
>>    
>>
>
>Copylist copies a list.  It does not copy its contents.  To copy its
>contents, you can write a simple recursive function:
>
>  copyall(l):=if listp(l) then map('copyall,l) else l;
>
>Since 'map' makes a list of the results, it is creating a new list, so
>you don't need copylist as well.
>
>  L:[a,[b],[[c]]]$
>  L1: copylist(L)$
>  L2: copyall(L)$
>  ( L[1]:q, L[2][1]:r, L[3][1][1]: s );
>
>  L =>  [q, [r], [[s]]]
>  L1 => [a, [r], [[s]]]
>  L2 => [a, [b], [[c]]]
>
>This does not copy lists nested within other structures, though:
>
>  xx: f([a])$
>  xx1: copyall(xx)$
>  part(xx,1)[1]: z$
>  xx => f([z])
>  xx1 => f([z])
>
>If it's necessary, you can write your own recursive function to copy
>these, too:
>
>  copyallall(l):=
>    block([inflag:true],   /* operate on internal forms */
>      if atom(l) or subvarp(l) then l
>      else funmake(copyallall(part(l,0)),
>                   map('copyallall,args(l))))$
>
>If you really want to handle the obscure case f[[x]], then you'll need
>this clause instead of "or subvarp(l)":
>
>      else if subvarp(l) then
>        arraymake(copyallall(part(l,0)),
>                  map('copyallall,args(l)))
>
>But you probably don't need anything as elaborate as copyallall, let
>alone the subvarp case.
>
>        -s
>
>_______________________________________________
>Maxima mailing list
>Maxima@www.math.utexas.edu
>http://www.math.utexas.edu/mailman/listinfo/maxima
>  
>