Re: Problem overriding simple built-in functions[2]
- To: mathgroup at smc.vnet.net
- Subject: [mg28861] Re: Problem overriding simple built-in functions[2]
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Wed, 16 May 2001 03:28:09 -0400 (EDT)
- References: <9dld4j$o9b@smc.vnet.net> <9dqdrf$4jr@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Apologies for the misposting of the following addendum (it went to Subject:
Re: column * row ??(2)).
I should have added the following alternative way of dealing with the
problem arising from the attribute Flat noted at the end of my previous
posting on this topic [copied below].
ClearAttributes[GCD, {Listable, Protected}]
SetAttributes[GCD,{OneIdentity}]
GCD[x_List]:= GCD@@x
GCD[{3,6}]
3
Protect[GCD
--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565
"Allan Hayes" <hay at haystack.demon.co.uk> wrote in message
news:9dqdrf$4jr at smc.vnet.net...
> One way out of this difficulty is to define
>
> MyGCD[x___]:= GCD@@Flatten[{x}]
>
> This gives
>
> MyGCD[{3,6}]
>
> 3
>
> Another possibility is suggested at the end of the following discussion.
>
>
> Here is what seems to be happening with the examples that you give.
>
> In Mathematica 4.1 we have
>
> atts=Attributes[GCD]
>
> {Flat,Listable,Orderless,Protected}
>
> [though in Help Browser, Listable is not mentioned]
>
> After
>
> Unprotect[GCD];
> GCD[x_List]:=GCD@@x
>
> I get, as you report,
>
> GCD[{3,6}]
>
> {3,6}
>
> The explanation is that the attribute Listable is used before any rules
for
> GCD are looked for.
> So the main steps in the evaluation are
>
> GCD[{3,6}]
> {GCD[3],GCD[6]} because of the attribute Listable
> {3,6}
>
> That new assignment was never used.
>
> With regard to
>
> Apply[GCD,{3,6}]
>
> 3
>
> The mains steps are
>
> Apply[GCD,{3,6}]
> GCD[3,6]
> 3
>
>
> HOWEVER: it is not sufficient to clear the attribute, Listable:
>
> ClearAttributes[GCD, Listable];
>
> We still get
>
> GCD[{3,6}]
>
> GCD[{3,6}]
>
> This is due to the attribute Flat:
>
> Starting with GCD[{3,6}] a peculiarity of the attribute Flat is that
> x_ in GCD[x_List]:=GCD@@x is matched to a held GCD[{3,6}] in the
> expression
> GCD[GCD[{3,6}]] which evaluates to GCD[{3,6}] without further
evaluation
>
> But we can do something about this:
>
> Clear the old definition:
>
> GCD[x_List]:=.
>
> Use instead
>
> GCD[{x___}] := GCD[x]
>
> Now we get
>
> GCD[{3,6}]
>
> 3
>
>
> --
> Allan
> ---------------------
> Allan Hayes
> Mathematica Training and Consulting
> Leicester UK
> www.haystack.demon.co.uk
> hay at haystack.demon.co.uk
> Voice: +44 (0)116 271 4198
> Fax: +44 (0)870 164 0565
>
> "Jean-Christophe Deschamps" <jchd at worldnet.fr> wrote in message
> news:9dld4j$o9b at smc.vnet.net...
> > Hi,
> >
> > I'm told the following occurs under Mathematica v4.0:
> >
> > In[1]:= GCD[{3, 6}]
> > Out[1]= {3, 6}
> > In[2]:= GCD[x_List] := Apply[GCD, x]
> > In[3]:= GCD[{3, 6}]
> > Out[3]= GCD[{3, 6}]
> > In[4]:= Apply[GCD, {3, 6}]
> > Out[4]= 3
> >
> > Why is it so? It looks like the override is ignored, but why?
> >
> > The same exerpt seems to work fine under version 2.x.
> >
>
>
>
>
>
>
>
>
>
>
>