Erlang is getting too big
Richard Carlsson
richardc@REDACTED
Tue Oct 14 16:41:34 CEST 2003
On Tue, 14 Oct 2003, Thomas Lindgren wrote:
> > But since auto-recognized BIFs override local
> > definitions (sic!),
> > this would probably break a lot of existing code.
>
> If you mean BIFs that do not need the erlang: prefix,
> then the override nowadays goes in the other
> direction. (And correctly so, IMO.)
>
> -module(test).
> -compile(export_all).
>
> abs(X) when X > 0 ->
> X;
> abs(X) ->
> -X.
>
> 1> c(test).
> ... Warning: defining BIF abs/1
Ah, but that warning only tells you that you have defined
a function called abs/1, which is also the name of an
auto-recognized BIF.
And if you call it from the outside, as in "test:abs(-1)",
your function is called, as you expect.
But if you try to use it for a local call, you get into
trouble, because it is overridden by the BIF:
-module(test).
-export([myabs/1, abs/1]).
myabs(X) ->
abs(X).
abs(X) when X > 0 ->
{abs, X};
abs(X) ->
{abs, -X}.
1> c(test).
./test.erl:7: Warning: defining BIF abs/1
{ok,test}
2> test:abs(1).
{abs,1}
3> test:myabs(1).
1
4>
(And no, the ordering of the functions above does not matter.)
Is this sufficiently confusing?
/Richard
Richard Carlsson (richardc@REDACTED) (This space intentionally left blank.)
E-mail: Richard.Carlsson@REDACTED WWW: http://user.it.uu.se/~richardc/
"Having users is like optimization: the wise course is to delay it."
-- Paul Graham
More information about the erlang-questions
mailing list