Re: Confused about contexts ...

*To*: mathgroup at christensen.cybernetics.net*Subject*: [mg570] Re: [mg523] Confused about contexts ...*From*: villegas (Robert Villegas)*Date*: Sun, 19 Mar 1995 05:22:09 -0600

Hello Paul, > I think I'm getting my contexts in a muddle. Can you help me with the > following please? > > Consider the following simple package: > > BeginPackage["Example`"] > test::usage = "Test function" > Begin["`Private`"] > test[a_] := Module[{}, z=Sin[x];Function[x,z]] > End[] > EndPackage[] > > I'm trying to code a function "test" that returns a function as its > argument. > Thus, _what_I'd_like_to_happen_ is this: > > In[1] := > <<Package.m > In[2] := > f = test[a] > Out[2] := > Function[x,Sin[x]] > In[3] := > f[theta] > Out[3] := > Sin[theta] > > However, what actually happens is this: > > In[1] := > <<Package.m > In[2] := > f = test[a] > Out[2] := > Function[Example`Private`x, Example`Private`z] > In[3] := > f[theta] > Out[3] := > Sin[Example`Private`x] The reason the z in Function[x, z] didn't expand to a formula is that Function is one of those things that doesn't evaluate its arguments. If you want to override this behavior, use Evaluate. Here's a simplified example to show what I mean: In[64]:= z = Sin[x] Out[64]= Sin[x] (* The formula ends up being 'z', literally: *) In[65]:= Function[x, z] Out[65]= Function[x, z] (* But we can make the formula be the _value_ of z instead: *) In[66]:= Function[x, Evaluate[z]] Out[66]= Function[x, Sin[x]] There could be another complication to deal with in your usage, because you've got a Function inside of a Module, which is a situation of nested scoping constructs. This is no problem, except that I suspect you might use 'z' as a local variable of the Module (in your real, bigger example, I mean), and also within the body of the Function. This would cause renaming of the Function's variable. A quick example: In[61]:= test[a_] := Module[{z}, z = Sin[x/a]; Function[x, Evaluate[z]] ] In[62]:= test[5] x Out[62]= Function[x$, Sin[-]] 5 One standard way to circumvent this is to disguise the Function by constructing it during the evaluation of the Module. Here's a way to do that: In[68]:= test[a_] := Module[{z}, z = Sin[x/a]; Function @@ {x, z}] In[69]:= test[5] x Out[69]= Function[x, Sin[-]] 5 Hopefully, this will do what you want. Best regards, Robby Villegas