[erlang-questions] illegal guard expression: filelib:is_dir(H)
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.
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) ->
> filelib:is_dir(H) ->
> process_directory(H, Fn);
> true ->
> process_file(H, Fn)
> 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