Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
1997
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 1997

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

Search the Archive

Re: Overloading mathematica built in functions

  • To: mathgroup at smc.vnet.net
  • Subject: [mg5749] Re: [mg5716] Overloading mathematica built in functions
  • From: Allan Hayes <hay at haystack.demon.co.uk>
  • Date: Tue, 14 Jan 1997 10:42:28 -0500
  • Sender: owner-wri-mathgroup at wolfram.com

seanross at worldnet.att.net
[mg5716] Overloading mathematica built in functions
writes

>I want to add a capability to the Sum function.  If I give it a
>single argument that is a 1-D list, I want it to sum the list.
>
>Unprotect[Sum];
>Sum[f_List]:=Sum[f[[i]],{i,1,Length[f]}];
>Protect[Sum];
>
>does not work.  Does anyone know why?  I am guessing it has  
>something to do with the attribute HoldAll on the built-in function  
>Sum.

Sean,
Yes, it is because of the HoldAll attribute: if
w = {1,2,3};
then in Sum[w], w is not evaluated to a list and the definition is  
not used. But, with

Unprotect[Sum];
Sum[f_/;Head[f]===List]:=Sum[f[[i]],{i,1,Length[f]}];
Protect[Sum];

The test is evaluated (in spite of the HoldAll) and we get

Sum[w]
	6
	
However, the following is much more faster
Sum[f_/;Head[f]===List]:= Plus@@f;
And even here, f is evaluated twice, so the following variant may  
be better

Sum[f_]:= Module[{g},Plus@@g/;Head[g = f]===List];



Allan Hayes,
hay at haystack.demon.co.uk
http://www.haystack.demon.co.uk




	



  • Prev by Date: Printing to HP LaserJet4
  • Next by Date: Memory saving mode of mathematica front end?
  • Previous by thread: Re: Overloading mathematica built in functions
  • Next by thread: Mathematica on Daystar