Pattern test and expression sequence
- To: mathgroup at smc.vnet.net
- Subject: [mg83122] Pattern test and expression sequence
- From: Jan Lellmann <lellmann at uni-mannheim.de>
- Date: Mon, 12 Nov 2007 05:11:00 -0500 (EST)
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