       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:= geom[{x + y}]

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

• Prev by Date: Re: MatrixForm odd behaviour
• Next by Date: Re: Is there any efficient easy way to compare two lists with the same length with Mathematica?
• Previous by thread: Re: Tips for writing correct, non trivial Mathematica Libraries
• Next by thread: Re: Tips for writing correct, non trivial Mathematica Libraries