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)?