Re: Tips for writing correct, non trivial Mathematica Libraries
- To: mathgroup at smc.vnet.net
- Subject: [mg124463] Re: Tips for writing correct, non trivial Mathematica Libraries
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Fri, 20 Jan 2012 01:54:09 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <201201191012.FAA03722@smc.vnet.net> <3609A129-8BFE-453D-B414-9C1D4366BA43@mimuw.edu.pl> <A0087CCC-AB33-4507-A793-9806842F1832@gmail.com>
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 non-empty vector nor a non-empty 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 non-empty vector nor a non-empty matrix geom[x + y] Andrzej Kozlowski
- References:
- Re: Tips for writing correct, non trivial Mathematica Libraries
- From: Bill Rowe <readnews@sbcglobal.net>
- Re: Tips for writing correct, non trivial Mathematica Libraries