 
 
 
 
 
 
Re: Module/Block problem (passing pointers?)
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg1852] Re: Module/Block problem (passing pointers?)
- From: wagner at bullwinkle.cs.Colorado.EDU (Dave Wagner)
- Date: Mon, 7 Aug 1995 20:27:16 -0400
- Organization: University of Colorado, Boulder
In article <DCqqK6.DvM at wri.com>,
Scott Herod <sherod at boussinesq.Colorado.EDU> wrote:
>I've got a problem that seems to call for using the Block construct over
>a Module, but for other reasons, I Modules are more appropriate.  I'll
>show the set-up with a Block and ask how I can make it a module.  Here
>is the basic code.
>
>test1 := Block[{flag},
>  Print["1,1 ",flag];
>  test2;
>  Print["1,2 ",flag];
>]
>
>test2 := Module[{},
>  Print["2,1 ",flag];
>  flag = True;
>  Print["2,2 ", flag];
>]
>
>In[3]:= test1
>
>1,1 flag
>2,1 flag
>2,2 True
>1,2 True
>
>
>This does what I want, ie "flag" is a local variable to the test1's
>execution and test1 knows that the value of flag was set in test2.
>
>I would really like test1 to be defined in terms of a Module, not a Block.
>Any suggestions?
>
>Oh, in the real problem, test2 is already a function and it would be
>inelegant to have it return flag as well.
>
>If it were possible to pass pointers it would be easy to send test2 the
>flag pointer and then check it in test1.  But I believe that Mathematica
>can only pass values, correct?
You can pass symbols "by reference" by making giving the function
to which you are passing them one of the "Hold"-type attributes. E.g.,
In[8]:=
    SetAttributes[settrue, HoldAll];
    settrue[x_] := x = True
In[10]:=
    Module[{flag},
	Print[flag];
	settrue[flag];
	Print[flag];
    ]
    flag$10
    True
Your choices are to hold either just the first argument (HoldFirst),
all but the first argument (HoldRest), or all of the arguments (HoldAll).
Alternatively, you could create the second function (your "test2")
without any attributes, and pass Unevaluated[flag] to the function.
In[11]:=
    settrue2[x_] := x = True
In[12]:=
    y = False;
    settrue2[Unevaluated[y]]
Out[13]=
    True
In[14]:=
    y
Out[14]=
    True
Just be sure not to accidentally leave out the Unevaluated:
In[15]:=
    y = False;
    settrue2[y]
    Set::wrsym: Symbol False is Protected.
Out[16]=
    True
		Dave Wagner
		Principia Consulting
		(303) 786-8371
		dbwagner at princon.com
		http://www.princon.com/princon

