Re: How to call by reference for particular argument(s)?
- To: mathgroup at smc.vnet.net
- Subject: [mg22116] Re: [mg22093] How to call by reference for particular argument(s)?
- From: Hartmut Wolf <hwolf at debis.com>
- Date: Wed, 16 Feb 2000 02:34:32 -0500 (EST)
- Organization: debis Systemhaus
- References: <200002140703.CAA12348@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Wen-Feng Hsiao schrieb:
>
> 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?
>
> Wen-Feng
To begin with the last, i'd code it more like:
u1 = {a, b, c, d, e, {b, d}}; u2 = {b, d};
Position[u1, #] & /@ u2
{{{2}, {6, 1}}, {{4}, {6, 2}}}
I redefined u1 a little bit, to show that this method is much stronger,
i.e. it gives better information. If you need your output in a different
form, it seems to be better to postprocess that!
Now to your function. It works if you undo the Hold for your first and
second argument:
u1 = {a, b, c, d, e}; u2 = {b, d};
res = {}; myPosition[Evaluate[u1], Evaluate[u2], res];
res
{2, 4}
An alternative would be to make your reference (res) be the first
argument of your function, and giving that the attribute HoldFirst. But,
as I said, it's better in many respects to stick as close as possible to
standard conventions and standard functionality.
Kind regards, Hartmut
- References:
- How to call by reference for particular argument(s)?
- From: d8442803@student.nsysu.edu.tw (Wen-Feng Hsiao)
- How to call by reference for particular argument(s)?