Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

While playing around with the solutions to this question, I've found some very strange behaviour:

MatchQ[3,_?Composition[Not,OptionQ]]
(*
==> False
*)
MatchQ[3,_?(Not[OptionQ[#]]&)]
(*
==> True
*)
Composition[Not,OptionQ][3]
(*
==> True
*)

So what's wrong with the first pattern? Or did I just find some bug?

share|improve this question
add comment

1 Answer 1

up vote 21 down vote accepted

Because PatternTest binds very tightly. You need extra parentheses:

MatchQ[3, _?(Composition[Not, OptionQ])]
share|improve this answer
    
Thanks. I should have thought of that possibility myself ... –  celtschk Feb 13 '12 at 16:44
5  
@celtschk This is not at all obvious - it binds stronger than a function call: a?f[b] // FullForm gives PatternTest[a,f][b], which is not something we are used to. I just happened to have been bitten by this a few times. The same story with the Function: have to wrap it in parentheses as well. I actually mentioned that in my answer to the question you linked. –  Leonid Shifrin Feb 13 '12 at 16:46
8  
This is one reason I tend to use Condition for anything that isn't completely trivial... –  Brett Champion Feb 13 '12 at 16:46
    
@Brett I use PatternTest in this form with parentheses quite a bit as well, but I agree that there are less chances for errors with Condition. –  Leonid Shifrin Feb 13 '12 at 16:50
3  
It's unusual for something to have a higher precedence than [...] function call ... –  Szabolcs Feb 13 '12 at 16:50
show 3 more comments

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.