Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2005
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2005

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

Search the Archive

Re: Warning from Piecewise

  • To: mathgroup at smc.vnet.net
  • Subject: [mg61547] Re: [mg61523] Warning from Piecewise
  • From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
  • Date: Sat, 22 Oct 2005 00:35:35 -0400 (EDT)
  • References: <200510210438.AAA13446@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

On 21 Oct 2005, at 13:38, Chris Rodgers wrote:

> Hi,
>
> When I try to set a delayed expression like this:
>
> Comm[Piecewise[A:{{_, _}..}], Piecewise[B:{{_, _}..}]] :=
>    Comm[Testy[A], Testy2[B]]
>
> I get a warning from Piecewise that says:
>
> Piecewise::pairs: The first argument A : {{_, _} ..} of Piecewise  
> is not
> a list of pairs.
>
> I thought that the HoldAll attribute on SetDelayed should prevent
> evaluation of the LHS argument, so where is this warning coming from?
>
> Can I ignore a warning like this, or should I instead use a different
> sort of pattern?
>
> Many thanks,
>
> Chris Rodgers.
>
>

Actually Set and SetDelayed are special functions and their behaviour  
in this sort of situation is not determined by their attributes. You  
can see the difference as follows. First, let us create a function H,  
to which we give the Attribute HoldAll.

SetAttributes[H, HoldAll]

Let's also define a function f to be:

f[x_] := Print[x]

(There is a reason why I need another function that does the same  
thing as Print).
Let's first try the following using a function G which evaluates its  
arguments:


G[f[x=1+1],p]

 From In[3]:=
2

Out[3]=
G(Null,p)

we can check that x has the value 2:

In[4]:=
x

Out[4]=
2

Now let's clear x and do the same thing with H:


In[5]:=
Clear[x]

In[6]:=
H[f[x=1+1],p]

Out[6]=
H(f(x=1+1),p)

In[7]:=
x

Out[7]=
x

No evaluation at all, as expected. Now let's again clear x and set H  
to be SetDelayed:

In[8]:=
Clear[x]

In[9]:=
H=SetDelayed;

In[10]:=
H[f[x=1+1],p]

We get no output, and nothing gets printed, which means f was not  
evaluated. However:

In[11]:=
x

Out[11]=
2

In other words, although SetDelayed does not evaluate the head of an  
expression on the LHS it does evaluate its other parts.
Why does it behave in this way? I think the reason is related to the  
way SetDelayed defines DownValues for symbols. Finally, you can avoid  
your message by defining Comm as follows:

Comm[Unevaluated[Piecewise[A : {{_, _} ..}]], Unevaluated[
           Piecewise[B : {{_, _} ..}]]] :=
    Comm[Testy[A], Testy2[B]]

In fact however it does not really matter. If you evaluate the  
definition with Unevaluated and one without and then check what  
Mathematica knows about Comm  with

?Comm

you will see exactly the same Output. So I think you are safe using  
your function, provided of course the rest of your code that you did  
not include is O.K.

Andrzej Kozlowski
Tokyo, Japan




  • Prev by Date: Re: Language vs. Library why it matters
  • Next by Date: Re: Re: Double integral of a piecewise-constant function
  • Previous by thread: Warning from Piecewise
  • Next by thread: Re: Warning from Piecewise