Search All of the Math Forum:
Views expressed in these public forums are not endorsed by
Drexel University or The Math Forum.



Re: Tips for writing correct, non trivial Mathematica Libraries
Posted:
Jan 20, 2012 1:51 AM


On 19 Jan 2012, at 15:55, Andrzej Kozlowski wrote:
> > On 19 Jan 2012, at 14:14, Nehal Patel wrote: > >> On Jan 19, 2012, at 6:39 AM, Andrzej Kozlowski wrote: >> >>> >>> On 19 Jan 2012, at 11:12, Bill Rowe wrote: >>> >>>>> >>>>> geom[list_] := Apply[Times, list]^(1/Length[list]) >>>> >>>>> So, this does a bad thing for geom[ x+ y] (returns (Sqrt[x y]) >>>> >>>> What were you expecting here? This looks correct to me >>> >>> Clearly he sees what actually is a powerful feature of Mathematica as a "bad thing". The feature is that a function whose arguments are not restricted by pattern maching can be put to a more general use. I think it's great and not "bad". If you want to restrict the function to work on lists you can do this: >>> >> >> Hi  thanks for your comment. Actually I think the pattern matching is the coolest thing. my point is that when combined with how Mathematica treats + (and in general, Flat and Orderless operators) it becomes a lot harder to reason about whether a function handles all edge cases correctly. So for instance nobody would expect the geometric mean of x + y to be Sqrt[x y], it should be (x + y)^1 = x+ y > > No, it shouldn't be. There is no such thing as a mean of a number or an algebraic expression. What you would expect is > > In[7]:= geom[{x + y}] > > Out[7]= x + y > > which is indeed what you get. > >> >> Separately, GeometricMean does do something reasonable for GeometricMean[x + y] (give it a try), and I wish it were easier to see what syntax it uses. > > It is very easy to do that, it in fact: > > Clear[geom] > > geom::nonlist = > "The argument `1` is neither a nonempty vector nor a nonempty matrix"; > > geom[ls_] /;If[Head[ls] === List, True, Message[geom::nonlist, x]; False] := > Apply[Times, ls]^(1/Length[ls]) > > geom[{x + y}] > > x + y > > geom[x + y] > > The argument x is neither a nonempty vector nor a nonempty matrix > > geom[x + y] > > Andrzej Kozlowski >
It should have been:
geom[ls_] /; If[Head[ls] === List, True, Message[geom::nonlist, ls]; False] := Apply[Times, ls]^(1/Length[ls])
and then:
geom[x + y]
geom::nonlist: The argument x+y is neither a nonempty vector nor a nonempty matrix
geom[x + y]=



