Re: Call-by-reference from inside a function
- To: mathgroup at smc.vnet.net
- Subject: [mg72576] Re: Call-by-reference from inside a function
- From: Peter Pein <petsie at dordos.net>
- Date: Wed, 10 Jan 2007 02:50:59 -0500 (EST)
- References: <eo012n$kp1$1@smc.vnet.net>
zac schrieb:
> Dear Group,
>
> I'm in need of a function, which is called with one argument, a list.
> The function is to chose one element of the list randomly, AND modify
> the original list by removing the chosen element from it. My problem is
> that I cannot modify the global variable from inside the function. It
> is not a solution to return with a list such as:
> Return[{chosen_element, modified_local_list}], and than make an
> assignment outside the function.
> I'm thinking on some call-by-reference method, but as I've learned so
> far, there is no user-friendly way to do this, just some workarounds
> (which I don't know). Any suggestions?
>
> Istvan
>
> example code below:
>
> RandomChoseElem[list_List] := Module[
> {pos, elem},
> pos = Random[Integer, {1, Length[list]}];
> elem = list[[pos]];
> (* This is to be solved inside : *)
> (* global`list = Drop[global`list, {pos}]; *)
> Return[elem]
> ];
>
> set = {1, 2, 3, 4};
>
> RandomChoseElem[set]
>
Hi Istvan,
use the attribute HoldFirst for your function and change "list_List" to simply
"list_".
SetAttributes[RandomChoseElem, HoldFirst];
RandomChoseElem[list_] :=
Module[{pos = Random[Integer, {1, Length[list]}], elem},
elem = list[[pos]];
Unevaluated[list] = Drop[list, {pos}];
elem];
lst = {a, b, c, d, e};
RandomChoseElem[lst]
--> a
lst
--> {b, c, d, e}
Hope that helps,
Peter