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

Kay Kay <>
Sun Feb 14 22:38:04 CET 2010



On 02/14/2010 03:01 AM, Kostis Sagonas wrote:
> 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 ?
>
> The if construct in Erlang is very restrictive w.r.t. what it can be 
> used with.  Do not use it.  Use case instead:
>
>  do_process_elements([],  _) ->   [];
>  do_process_elements([H | _], Fn) ->
>    case filelib:is_dir(H) of
>      true ->
>        process_directory(H, Fn);
>      false ->
>        process_file(H, Fn)
>    end.
>
> Kostis

Thanks for the clarification.

 From a runtime cost - would this be any different ( in terms of 
time/space complexity) from adding another rule to do the same . (eg, as 
given below ? ) .


do_process_unixfile(true, H, Fn) ->
     process_directory(H, Fn);
do_process_unixfile(false, H, Fn) ->
     process_file(H, Fn).

  do_process_elements([],  _) ->   [];
  do_process_elements([H | _], Fn) ->
    do_process_unixfile( filelib:is_dir(H), H, Fn).

I find the latter 'purely' functional and amenable for optimization, 
than the former , which comes to me as a 'procedural' construct.  Is 
there any document / guide to refer to , for best practices with Erlang 
for cases like this ?




More information about the erlang-questions mailing list