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. >