MathGroup Archive 1998

[Date Index] [Thread Index] [Author Index]

Search the Archive

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


  • Prev by Date: Re: Getting rid of annoying zeroes in algebraic expressions
  • Next by Date: Re: Matrix Problem
  • Previous by thread: Re: strange function that defines a function---how do I do it?
  • Next by thread: Re: strange function that defines a function---how do I do it?