[erlang-questions] illegal guard expression: filelib:is_dir(H)

Jayson Vantuyl <>
Sun Feb 14 12:09:10 CET 2010


Oddly, in Erlang, "if" only accepts expressions that are valid in  
guards. This usually means special builtin functions that are normally  
used to make pattern matching more precise. Because pattern matching  
must be fast, most function calls are forbidden.

For this reason, you'll usually see a case (or a try) statement where  
you'd expect an "if".

To make thing even more confusing, "if" is most useful when you have a  
number of unrelated comparisons (limited to guards) that should be  
checked until one is true. Most other languages would use a chain of  
if-elsif-else statements or even a case statement.  E.g. "case  
filelib:is_dir(H) of true -> ...; false -> ... end"

To top it off, you could save that expression in a variable and that  
could work, but would still be confusing. E.g. "F = filelib:is_dir(H),  
if F == true -> ...; true -> ... end"

This is all a but backwards and probably more confusing than it has a  
right to be.  That said, you should probably read the section of the  
Erlang manual about guards. Once you grok them, they're powerfully  
useful. Until then, just remember that "if" is for guards only, and  
you probably want a case (or try) statement.

Good luck!

Sent from my iPhone

On Feb 14, 2010, at 2:51 AM, Kay Kay <> wrote:

> I have a function along the following lines
>
> do_process_elements([],  _) ->   [];
> do_process_elements([H | _], Fn) ->
>  if
>    filelib:is_dir(H) ->
>      process_directory(H, Fn);
>    true ->
>      process_file(H, Fn)
>  end.
>
>
> When I compile - I get the following error,  where the line number  
> refers to    - filelib:is_dir(H) function.
>
> ./test.erl:23: illegal guard expression
>
> Given that filelib:is_dir(H) returns true / false  - I thought this  
> would fit in here as a predicate. What could be going wrong ?
>
>
>
>
>
>
> ________________________________________________________________
> erlang-questions (at) erlang.org mailing list.
> See http://www.erlang.org/faq.html
> To unsubscribe; mailto:
>


More information about the erlang-questions mailing list