Re: How to call by reference for particular argument(s)?
- To: mathgroup at smc.vnet.net
- Subject: [mg22218] Re: How to call by reference for particular argument(s)?
- From: Tobias Oed <tobias at physics.odu.edu>
- Date: Fri, 18 Feb 2000 02:34:58 -0500 (EST)
- Organization: Old Dominion University
- References: <8889e1$c4r@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Wen-Feng Hsiao wrote:
>
> Dear all,
>
> I cannot figure out how to call by reference for particular arguments.
> Say, I want to design a function, which will return the position list
> where the second list locates in the first list. For example,
>
> If one inputs the following code:
>
> In[1]:=
> res={};
> myPosition[{a, b, c, d, e}, {b, d}, res];
> res
>
> It outputs {2, 4}. Since the b and d in the second list are in the
> positions 2 and 4 of first list. My code is listed below.
>
> SetAttributes[myPosition, HoldAll];
> myPosition[v1_, {e1_, e2___}, res_Symbol] := Module[{tmp},
> tmp = Flatten[Position[v1, e1]];
> If[Length[tmp] != 0,
> AppendTo[res, tmp[[1]]]];
> If[nil[{e2}] =!= nothing, (* if e2 not null *)
> myPosition[v1, {e2}, res]]];
>
> The difficulties are when I change it to the followings, it cannot work:
>
> In[10]:=
> res={};
> u1={a, b, c, d, e}; u2={b, d};
> myPosition[u1, u2, res];
> res
>
> the myPosition[u1, u2, res] cannot be resolved. How can I do? Change the
> signature to myPosition[v1_Symbol, {e1_Symbol, e2___Symbol}, res_Symbol]
> does not work either. It's obvious that the intended call by reference is
> only for the third argument "ref", so please show me the rope, thanks!
> Furthermore, is there any function exists for the same purpose as
> myPosition?
I am not sure about what exactly you are trying to do but it seems
extreemly
clumsy too my. Why not skip the whole myPosition thing and use insted
res=Map[First,Position[u1,Apply[Alternatives,u2],1]]
which you can write using prefix notation as
res=First /@ Position[u1,Alternatives @@ u2,1]
which is shorter by 6 chars but certainly less readable. Or at least so
I
think,
cheers Tobias