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

*To*: mathgroup at smc.vnet.net*Subject*: [mg15264] Re: strange function that defines a function---how do I do it?*From*: "Allan Hayes" <hay at haystack.demon.co.uk>*Date*: Wed, 30 Dec 1998 01:50:26 -0500*References*: <75no5e$sgj@smc.vnet.net> <75q118$20o@smc.vnet.net> <7672ri$ps8$8@dragonfly.wolfram.com>*Sender*: owner-wri-mathgroup at wolfram.com

David Reiss wrote in message <7672ri$ps8$8 at dragonfly.wolfram.com>... ............ ............ >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 > Thanks David, Yes, I should have followed it through in this form. The solution, as you indicate, is to use the fuller form Pattern[#,_?NumberQ]& in place of #_?NumberQ. In[1]:= makefunction2[var_, expr_] := Block[{f, SetDelayed}, f @@ ((Pattern[#,_]?NumberQ&)/@ var):= expr] In[2]:= list = {x1, x2}; In[3]:= makefunction2[list, 6] In[4]:= DownValues[f]//InputForm Out[4]//InputForm= {HoldPattern[f[(x1_)?NumberQ, (x2_)?NumberQ]] :> 6} In[5]:= f[2,3] Out[5]= 6 The parsing of #_ to Times[Blank[],Slot[1]] seems to be a feature: # is the format for Slot[1]. The initial parsing of #_ is #_ --> Slot[1]_ which behaves like s[1]_ _ s[1] FullForm[%] Times[Blank[],s[1]] 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