Re: List manipulation question
- To: mathgroup at smc.vnet.net
- Subject: [mg15880] Re: [mg15852] List manipulation question
- From: David Withoff <withoff>
- Date: Wed, 17 Feb 1999 23:33:33 -0500
- Sender: owner-wri-mathgroup at wolfram.com
> 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}
>
> In[4]:= temp = mylist[[2]];
> mylist[[2]]=mylist[[3]];
> mylist[[3]] =temp;
> mylist
>
> Out[4]= {1,3,2}
Swap23 is an assignment operation (it assigns a new value to mylist),
and like all assignment operations must hold the argument unevaluated
in order to work. Also, the argument will be the symbol that is getting
a new value, not the expression that results after that symbol has
been evaluated.
For example, you could use
In[1]:= Swap23[L_Symbol]:=Module[
{temp},
temp = L[[2]];
L[[2]]=L[[3]];
L[[3]] =temp;
L
]
In[2]:= mylist = {1,2,3};
In[3]:= Swap23[Unevaluated[mylist]]
Out[3]= {1, 3, 2}
or you could set the HoldFirst attribute so that the argument will be held
unevaluated by default, as in:
In[4]:= SetAttributes[Swap23, HoldFirst]
In[5]:= Swap23[mylist]
Out[5]= {1, 2, 3}
The need to hold the argument unevaluated in assignment operations is
a logical necessity in all programming languages, since a function can
only change the value of a variable if it knows what the variable is.
All of the assignment functions in Mathematica (Set, SetDelayed,
Increment, etc.) have attributes set for holding arguments unevaluated.
Dave Withoff
Wolfram Research