Re: Problem overriding simple built-in functions
- To: mathgroup at smc.vnet.net
- Subject: [mg28851] Re: Problem overriding simple built-in functions
- From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
- Date: Tue, 15 May 2001 00:59:26 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Well noticed Allan. Another case of "f-grouping" striking when you least expect it. That suggests another way to "deal with the problem", (which, of curse,I am not seriously proposing as a way to deal with the original problem): In[1]:= Unprotect[GCD]; In[2]:= ClearAttributes[GCD,Listable] In[3]:= SetAttributes[GCD,OneIdentity] In[4]:= GCD[x_List]:=GCD@@x In[5]:= GCD[{4,6}] Out[5]= 2 -- Andrzej Kozlowski Toyama International University JAPAN http://platon.c.u-tokyo.ac.jp/andrzej/ http://sigma.tuins.ac.jp/~andrzej/ on 01.5.14 8:24 PM, Allan Hayes at hay at haystack.demon.co.uk wrote: > 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. >> > > > > > > > > > >