Re: Pattern test and expression sequence
- To: mathgroup at smc.vnet.net
- Subject: [mg83138] Re: Pattern test and expression sequence
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Tue, 13 Nov 2007 03:30:42 -0500 (EST)
- Organization: The Open University, Milton Keynes, UK
- References: <fh9903$ap6$1@smc.vnet.net>
Jan Lellmann wrote: > I want to define a pattern that accepts a sequence of expressions (of > arbitrary length) that matches some condition. So as a minimalist > example, if I wanted to accept all expressions with f as head and at > least 2 arguments, I want to write > > myQ[x__] := (Print[x]; Length[{x}] > 1) > f[x__?myQ] := works[x]; > f[1, 2] > > This should print "1 2" and return "works[1,2]". But it doesn't, it just > prints "1" and returns f[1,2] unevaluated. So apparenty Mathematica does > not pass the complete expression sequence to myQ, but only the first > element ("1"). > > There is a workaround using /; : > f[x__] /; (myQ[x] == True) := works[x]; > > but it is rather ugly and cumbersome when there is more than one argument. > > Does anyone have an idea why Mathematica does this? Is it a bug? Or is > there a (nice) workaround? Replace the test "?myQ" by "/; myQ[x]", as in the following: In[1]:= myQ[x__] := (Print[x]; Length[{x}] > 1) f[x__ /; myQ[x]] := works[x]; f[1, 2] During evaluation of In[1]:= 12 Out[3]= works[1, 2] Regards, -- Jean-Marc