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

```

• Prev by Date: Compile a Module
• Next by Date: Re: Dividers formatting in Grid
• Previous by thread: Re: Pattern test and expression sequence
• Next by thread: Re: Pattern test and expression sequence