your mail

David Gould <>
Sun Jan 16 10:10:46 CET 2000


On Sun, Jan 16, 2000 at 10:50:04AM +1100, Bob Smart wrote:
> Why is this an illegal guard
> 
> -module(t).
> -export([test/0]).
> 
> test() ->
>   if
>     33 == list_to_integer("33") -> 99;
>     true -> 88
>   end.
> 
> but this is ok
> 
> -module(t).
> -export([test/0]).
> 
> test() ->
>   Num = list_to_integer("33"),
>   if
>     33 == Num -> 99;
>     true -> 88
>   end.
> 

Because not all BIFs are "Guard BIFs". In this case, list_to_integer/1 is
not allowed as a guard.

As best I can tell from the documentation, it looks like guards are expected
to take O(1) time. I am not sure the is a hard and fast rule, but it appears
to explain why some BIFs are ok in guards and some are not.

By the above, list_to_integer/1 which is O(n) will not be allowed in a guard.

Just speculating, but I think the intent of the restriction might be to
encourage programmers to use good Erlang style, that is use multiple
function clauses and guards, not internal case expressions. The point being
if we can count on guards being very cheap, it is easy to accept using
lots of them.

Anyone who really knows this, please feel free to give the real answer.

-dg
 

-- 
David Gould                              510.536.1443 
- If simplicity worked, the world would be overrun with insects. -




More information about the erlang-questions mailing list