Why are there different naming styles?

Because not having a way to recognize the special-case guard-enabled functions would be more confusing to new-comers.

Guards are used much, much more often than they are created—they are possibly typed out more than any other function or macro, if and def included. This is especially true of the is_ type-check guards since they are the only way to switch on type information, in or outside function heads. So you will rapidly become fluent with this special casing.

We want new-comers to learn fast and well the fact that you can’t throw just any predicate function into a guard. Accepting the cognitive burden of remembering which functions are allowed in guards is far more important than the burden of remembering to use a different naming style when writing them, and if they were named identically it would be much harder to memorize which is which for the first time.

Additionally, this naming difference helps visibility and discoverability: we want these special cases to stand out in documentation, we want people like you to notice the discrepancy and take note of it like you have here, instead of frustratedly filing bug reports about how only some predicates seem to work in guards. :smile: So I think it has proved an effective decision.