Re: something nice I found today, return multiple values from a function
- To: mathgroup at smc.vnet.net
- Subject: [mg113134] Re: something nice I found today, return multiple values from a function
- From: "Nasser M. Abbasi" <nma at 12000.org>
- Date: Wed, 13 Oct 2010 23:29:20 -0400 (EDT)
- References: <i927an$3io$1@smc.vnet.net> <i93kbo$e67$1@smc.vnet.net>
- Reply-to: nma at 12000.org
On 10/12/2010 11:42 PM, Albert Retey wrote:
>>
>
> 1) I think it has been mentioned in another post today: Module with an
> empty list is just an elaborate noop: You better just say:
>
> getPointCoordinates[x_, y_] := {x -> 10, y -> 7}
>
Ok, but I was just using an example to illustrate the main point of how
to package multiple return values neatly.
> 2) you also might like this:
>
>
> makepoint[p_Symbol,xx_,yy_]:=(p[x]=xx;p[y]=yy; p);
>
> makepoint[p,10,7]
>
> p@x
> p@y
>
> hth,
>
> albert
>
Well, after more playing around, I know settled on this 'pattern'.
But before I show it, let me be clear what I am trying to do: Sometimes
I call a Module[] with some input parameters, and it does some
computation, and return back number of results. I used to return the
result in a LIST to the caller. Had to make sure I access the return
values from the list on return in the same order they are put in.
A struct would have solved this. But now I can do this, please let me
know what you think of this new way:
In[11]:= computeSomething[r_] := Module[{var1 = -99, var2 = 20, result},
result["x"] = var1*r; result["y"] = var2*r;
result];
In[12]:= result = computeSomething[30];
x = result["x"]
y = result["y"]
Out[13]= -2970
Out[14]= 600
---- define some module to do some work and return many results
computeSomething[r_] := Module[{var1 = -99, var2 = 20, result},
result["x"] = var1*r;
result["y"] = var2*r;
result]
---- now call it with some data to compute something
result = computeSomething[30];
--- now result is in a struct-like, I can access the
--- result by NAME, which is important
x = result["x"]
y = result["y"]
Out[9]= -2970
Out[10]= 600
---------------------------
Now I think I have what seems like a good struct emulation in
Mathematica. unless I found a problem with this 'pattern', I think I
will start using it.
The above is better than what I used to do which is:
------------------------------
computeSomething[r_] := Module[{var1 = -99, var2 = 20, result},
result = {var1*r, var2*r}
];
result = computeSomething[30];
x = result[[1]]
y = result[[2]]
Out[7]= -2970
Out[8]= 600
-------------------------------------
The difference is that now I do not have to worry about which position
each individual result is at. Instead of result[[1]], I write result["x"]
Thanks all for the input.
--Nasser