Why are there different naming styles?

An irrelevant question, there are function names like Integer.is_odd, and there are function names like Enum.empty?, why the two different naming styles?

1 Like

Traditionally, Erlang uses is_xxx for functions which return a boolean value. In particular, functions which can be used in guards, of which many are indeed is_xxx functions, were taken wholesale into Elixir from Erlang. Currently, in Elixir, the is_xxx format serves as an indicator that a function / method can be used inside a guard. Since Integer.is_odd/1 is a macro which can be placed into a guard, it also follows this convention. Most other Elixir functions which return a boolean value, such as Enum.empty?/1 cannot be placed in guards, and follow the normal Elixir xxx? naming convention.


But non-boolean guard-friendly functions such as div and rem do not have such indicator, why should boolean functions be a special case? For fresh Elixir programmers, remembering different naming styles can be a burden, so why not use xxx? style exclusively?


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.


As a side note, this convention is explained in the Naming Conventions doc page.