Re: Call-by-reference from inside a function

*To*: mathgroup at smc.vnet.net*Subject*: [mg72580] Re: Call-by-reference from inside a function*From*: albert <awnl at arcor.de>*Date*: Wed, 10 Jan 2007 03:07:03 -0500 (EST)*References*: <eo012n$kp1$1@smc.vnet.net>

Hi Istvan, > 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? What you are probably looking for is the attribute HoldAll or HoldFirst. Is the following doing what you want and user-friendly enough? SetAttributes[RandomChoseElem, HoldFirst]; RandomChoseElem[list_?(MatchQ[#, _List] &)] := Module[{ pos, elem }, pos = Random[Integer, {1, Length[list]}]; elem = list[[pos]]; list = Delete[list, pos]; Return[elem] ]; you probably want to define a reasonable return value for the empty list... hth, albert