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