MathGroup Archive 2007

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

Search the Archive

Pattern test and expression sequence


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,

  • Prev by Date: Dividers formatting in Grid
  • Next by Date: Re: Optimizing fixed point iteration
  • Previous by thread: Re: Re: Dividers formatting in Grid
  • Next by thread: Re: Pattern test and expression sequence