[erlang-questions] Compiler to warn on used underscore-variables

Kostis Sagonas <>
Tue Jan 5 09:43:35 CET 2010


Zoltan Lajos Kis wrote:
>>> Currently the compiler outputs a warning if a variable is only used
>>> once.
>>> The "standard" way to suppress this warning is to put an underscore in
>>> front
>>> of the variable name.
>>> As a result, an underscore-variable in source codes gives us (at least
>>> for
>>> me) the false notion that it is not a real variable, but only a means to
>>> enhance code readability.
>>> However the compiler treats them just like ordinary variables, resulting
>>> in
>>> unexpected (i.e. most astonishing ;-)) no match exceptions.
>>>
>> They *ARE* ordinary variables! All variables are variables irrespective of
>> whether there name starts with a capital letter or an "_". The *ONLY*
>> exception is the variable '_' which is the anonymous or don't care
>> variable.
>> It always matches and is never bound, which means it can only be used in
>> patterns. Or to be more correct, if it used in a term then the compiler
>> will complain about an unbound variable.
>>
>> The special treatment of variables starting with "_" is a feature/hack in
>> the compiler to get around its feature/hack of warning about variables
>> which
>> are never used. It was included to allow users to to give names to
>> variables
>> they don't intend to use for documentation purposes. I personally don't
>> like and never use them, if I don't want the value I use '_'.
>>
>>> My question is: what is your opinion about / is it possible to modify the
>>> compiler so that it outputs a warning if an underscore-variable is used
>>> (not
>>> unused) in the code ?
>>>
>> It is of course possible but I thinkt that would be even more
>> counter-intuitive.
>>
>> Robert
>>
> 
> I understand that they are ordinary variables. But I am certain that all
> the _Var variables I have seen so far were named so in order to indicate
> that they are intentionally unused, and not because of some strange naming
> habit.

Well, your statement depends on the code that you've seen, but my 
experience is different.  We often use the following coding convention. 
  We define a macro that outputs some debugging information:

-ifdef(DEBUG).
-define(debug(Str, Vars),  io:format(Str, Vars)).
-else.
-define(debug(Str, Vars),  ok).
-endif.

and use it in code that looks as follows:

foo(....) ->
     case do_something(...) of
       {X,Y,Z} -> ...
       _Other ->
          ?debug("Strange: do_something returned ~p\n", [_Other]),
          ....
     end.

We want the compiler to be silent about _Other being unused when not 
debugging and use _Other as an ordinary variable when debugging is on.
We definitely do not want the compiler to be warning for used 
underscore-starting variables in such cases.

Kostis


More information about the erlang-questions mailing list