Re: strange function that defines a function---how do I do it?

*To*: mathgroup at smc.vnet.net*Subject*: [mg15250] Re: strange function that defines a function---how do I do it?*From*: dreissBLOOP at bloop.earthlink.net (David Reiss)*Date*: Sun, 27 Dec 1998 03:58:40 -0500*Organization*: EarthLink Network, Inc.*References*: <75no5e$sgj@smc.vnet.net> <75q118$20o@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

In article <75q118$20o at smc.vnet.net>, "Allan Hayes" <hay at haystack.demon.co.uk> wrote: > Benjamin Lotto wrote in message <75no5e$sgj at smc.vnet.net>... > >Working with Mathematica 3.0: > > > >Suppose I define > > > > makefunction[var_, expr_]:=f[var_?NumberQ]:=NIntegrate[expr,{x,0,1}] > > > >Then I can do something like > > > > z=x^2 > > makefunction[x,z] > > > >and it will be just as if I typed > > > > f[x_?NumberQ]:=NIntegrate[x^2,{x,0,1}] > > > >In fact, entering > > > > ?f > > > >at this point yields > > > > "Global`f" > > > > f[(x_)?NumberQ] := NIntegrate[x^2, {x, 0, 1}] > > > >OK, now suppose I have a list of variables x1 up through xn. Suppose > >they're in a list: > > > > list={x1,x2,...,xn} > > > >I want something like "makefunction" above so that when I type > > > > makefunction[list,expr] > > > >it will be just as if I typed > > > > f[x1_?NumberQ,x2_?NumberQ,...,xn_?NumberQ]:=expr > > > >analogous to the above. Can anyone help me? > > > >Thanks in advance. Y'all out there have been very helpful in the past. > > > > Benjamin: > > One way > > Clear["`*"] > > makefunction[var_, expr_] := > Block[{f, SetDelayed}, f @@ (#_?NumberQ & /@ var) := expr] > > list = {x1, x2}; > > makefunction[list, 6] > > Check > > ?f > > Global`f > f[x1 _?NumberQ, x2 _?NumberQ] := 6 > > > We can get problems if f is not blocked and there are no tests > > Clear["`*"] > > makefunction[var_, expr_] := Block[{SetDelayed}, f @@ (#_ & /@ var) := > expr] > > list = {x1, x2}; > > makefunction[list, 6] > > ?f > > Global`f > f[x1 _, x2 _] := 6 > > But if we define a second time then f[x1_,x_2] evaluates to 6 before > the setting is made and the definition fails: > > makefunction[list, 6] > > SetDelayed::"setraw": "Cannot assign to raw object 6." > > $Failed > > Allan > > --------------------- > Allan Hayes > Mathematica Training and Consulting > www.haystack.demon.co.uk > hay at haystack.demon.co.uk > Voice: +44 (0)116 271 4198 > Fax: +44 (0)870 164 0565 Hi Alan, Unfortunately this approach uncovers a bug or feature concerning the use of a pattern in a pure function. If we follow through with your example one step further In[1]:= Clear[makefunction]; makefunction[var_, expr_] := Block[{f, SetDelayed}, f @@ (#_?NumberQ & /@ var) := expr] In[2]:= list = {x1, x2}; In[3]:= makefunction[list, 6] In[4]:= ?f "Global`f" f[x1*_?NumberQ, x2*_?NumberQ] := 6 If all were well we would expect the following to give 6 as the result In[5]:= f[2,3] Out[5]= f[2,3] However, this does In[6]:= f[x1 2,x2 3] Out[6]= 6 What seems to be happening is the following In[7]:= (#_&)@z Out[7]= z _ Note the space between the z and the _ In[8]:= FullForm[%] Out[8]//FullForm= Times[z,Blank[]] So, typing the two characters # and _ into an input cell is inperpreted by the frontend as the product #*_ rather than what we want, which is #_. Indeed when these two characters are typed, the frontend automatically puts a space between them in the same wayit does when a symbol is preceeded by a number as in In[9]:= 2x Out[9]= 2 x I tried initially to use the pattern #_ in a pure function, but ran into this problem, so I used the following instead In[10]:= Pattern[#,_]&[z] Out[10]= z_ So, do you think that this auto-formatting of #_ into # _ is a bug or feature? -- David Reiss dreissBLOOP at bloop.earthlink.net To send personal email, remove the words "bloop" and "BLOOP" from the email address