Re: Warning from Piecewise

*To*: mathgroup at smc.vnet.net*Subject*: [mg61549] Re: Warning from Piecewise*From*: albert <awnl at arcor.de>*Date*: Sat, 22 Oct 2005 00:35:41 -0400 (EDT)*References*: <dja298$fhh$1@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

Hi Chris, > 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? It does, but of course the code within SetDelayed can evaluate whatever part of it's arguments it likes. For some reason this is done if the first argument is not just a symbol. Check this: i = 1 f[i] := 5 DownValues[f] To avoid the errormessage and get the result you want you could wrap HoldPattern around your arguments: Comm[HoldPattern[Piecewise[A : {{_, _} ..}]], HoldPattern[Piecewise[B : {{_, _} ..}]]] := Comm[Testy[A], Testy2[B]] just checked and found that you will need a different pattern because Piecwise automatically adds a second argument if called with only one argument: In[2]:= Piecewise[{{0 < x < 1, x}, {1 < x, 1}}]//InputForm Out[2]//InputForm= Piecewise[{{0 < x < 1, x}, {1 < x, 1}}, 0] So this pattern should do what you want: Comm[HoldPattern[Piecewise[A : {{_, _} ..}, 0]], HoldPattern[Piecewise[B : {{_, _} ..}, 0]]] := Comm[Testy[A], Testy2[B]] but of course you should handle the last argument correctly if the Comm-function shall handle arbitrary Piecewise-functions... hth albert