MathGroup Archive 1999

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: List manipulation question

  • To: mathgroup at smc.vnet.net
  • Subject: [mg15893] Re: List manipulation question
  • From: "Allan Hayes" <hay at haystack.demon.co.uk>
  • Date: Wed, 17 Feb 1999 23:33:40 -0500
  • References: <7a2b7v$1t6@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Maarten.vanderBurgt at icos.be wrote in message <7a2b7v$1t6 at smc.vnet.net>...
>
>Dear all,
>
>In the following piece of code I define a function Swap23 which is ment
>to swap elements 2 and 3 in a list.
>Executing the function on a simple list I get an error. Why do I get
>this error? Why do I not get this error when I execute the commnad from
>Swap23 "by hand" as is shown in In[4]?
>
>Thanks for any help
>
>
>Maarten van der Burgt
>Icos Vision Systems
>Leuven
>Belgium
>
>
>In[1]:=Swap23[L_List]:=Module
>[
>          {temp},
>           temp = L[[2]];
>          L[[2]]=L[[3]];
>          L[[3]] =temp;
>          L
>]
>
>In[2]:= mylist = {1,2,3};
>
>In[3]:= Swap23[mylist]
>
>Set::"setps": "\!\({1, 2, 3}\) in assignment of part is not a symbol."
>Set::"setps": "\!\({1, 2, 3}\) in assignment of part is not a symbol."
>
>Out[3]= {1,2,3}


The input Swap23[mylist] evaluatest mylist to get Swap[{1,2,3}]
Then it passes {1,2,3} to L on the right, triggers a scoping change of temp
to temp$ and gets

Module[{temp$},
    temp$ = {1, 2, 3}[[2]];
     {1, 2, 3}[[2]] = {1, 2, 3}[[3]];
     {1, 2, 3}[[3]] = temp$;
     {1, 2, 3}
]

There are two problems here:

1) {1, 2, 3}[[2]] = {1, 2, 3}[[3]];  is not allowed:
the form must be
    s[[2]] = .. where s is a symbol with a value previously assigned by Set
(=), not SetDelayed(:=), and the value must have part 2.

3) the output is already fixed as {1,2,3}.

Here is a version that works, and uses features of part setting,

Swap23[L_List]:=
    Module[{temp = L},
    temp[[{2,3}]]=L[[{3,2}]];
    temp
]

mylist = {1,2,3}

Swap23[mylist]

    {1,3,2}

>
>In[4]:=   temp = mylist[[2]];
>          mylist[[2]]=mylist[[3]];
>          mylist[[3]] =temp;
>          mylist
>
>Out[4]= {1,3,2}

This works becaues mylist is a symbol with preset value {1,2,3}


Allan

---------------------
Allan Hayes
Mathematica Training and Consulting
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565





  • Prev by Date: Need Mathlink program Example
  • Next by Date: Re: CellLabel with special characters
  • Previous by thread: Re: List manipulation question
  • Next by thread: Re: List manipulation question