MathGroup Archive 2012

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

Search the Archive

Re: Tips for writing correct, non trivial Mathematica Libraries

  • To: mathgroup at smc.vnet.net
  • Subject: [mg124450] Re: Tips for writing correct, non trivial Mathematica Libraries
  • From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
  • Date: Fri, 20 Jan 2012 01:49:38 -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> <02BFEBF3-35C4-4C4E-83B7-E0A4EDBF6512@mimuw.edu.pl>



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 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
>


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 non-empty vector nor a non-empty matrix

geom[x + y]=



  • Prev by Date: Re: Tips for writing correct, non trivial Mathematica Libraries
  • Next by Date: Re: BoxWhiskerChart and a Vertical Line on same graph
  • Previous by thread: Re: Tips for writing correct, non trivial Mathematica Libraries
  • Next by thread: Re: Tips for writing correct, non trivial Mathematica Libraries