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