Re: Problem overriding simple built-in functions
- To: mathgroup at smc.vnet.net
- Subject: [mg28831] Re: Problem overriding simple built-in functions
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Tue, 15 May 2001 00:59:02 -0400 (EDT)
- References: <9dld4j$o9b@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
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.
>