Re: Call-by-reference from inside a function
- To: mathgroup at smc.vnet.net
- Subject: [mg72574] Re: [mg72568] Call-by-reference from inside a function
- From: Carl Woll <carlw at wolfram.com>
- Date: Wed, 10 Jan 2007 02:42:57 -0500 (EST)
- References: <200701091249.HAA21706@smc.vnet.net>
zac wrote:
>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]
>
>
Give RandomChoseElem the attribute HoldAll. Here is a modified version
of your function:
SetAttributes[RandomChoseElem,HoldAll]
RandomChoseElem[list_]:=Module[
{pos,elem},
pos=Random[Integer,{1,Length[list]}];
elem=list[[pos]];
(*This is to be solved inside:*)
list=Drop[list,{pos}];
elem
]/;MatchQ[list,_List]
I eliminated the superfluous Return statement, and moved the List
checking into a condition since the HoldAll attribute will interfere
with the pattern matching approach. Testing:
set={1,2,3,4}
{1,2,3,4}
RandomChoseElem[set]
1
set
{2,3,4}
Carl Woll
Wolfram Research
- References:
- Call-by-reference from inside a function
- From: "zac" <replicatorzed@gmail.com>
- Call-by-reference from inside a function