 
 
 
 
 
 
Re: Pattern test and expression sequence
- To: mathgroup at smc.vnet.net
- Subject: [mg83144] Re: Pattern test and expression sequence
- From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
- Date: Tue, 13 Nov 2007 03:33:48 -0500 (EST)
- Organization: Uni Leipzig
- References: <fh9903$ap6$1@smc.vnet.net>
- Reply-to: kuska at informatik.uni-leipzig.de
Hi,
x__?myQ is a pattern that is satifyed by a single
x with myQ[x]===True
if the sequence of x__ has more than a single element
than *all* elements must satisfy the test myQ[] and
since you test fail for a single element the tests
for the other elements are not done anymore.
Regards
   Jens
Jan Lellmann wrote:
> Hello,
> 
> 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?
> 
> Best regards,
>    Jan
> 

