[erlang-questions] Overriding built-in functions in a module
Igor Ribeiro Sucupira
igorrs@REDACTED
Wed Jun 9 07:42:58 CEST 2010
On Tue, Jun 8, 2010 at 10:53 PM, Richard O'Keefe <ok@REDACTED> wrote:
>
> The mistake here isn't that bar/1 isn't used, but that
> it's not *exported*. We can see this even more clearly
> if we change the example:
>
> 1 -module(foo).
> 2 -export([bah/1]).
> 3 bar(X) when X < 0 -> ugh(-X);
> 4 bar(X) -> X+1.
> 5 ugh(X) when X < 0 -> bar(-X);
> 6 ugh(X) -> X-1.
>
> ./foo.erl:2: function bah/1 undefined
> ./foo.erl:3: Warning: function bar/1 is unused
> ./foo.erl:5: Warning: function ugh/1 is unused
>
> This time there *is* a local function call to bar/1
> and there *is* a local function call to ugh/1. They
> are both *used*. What they aren't is *reachable*.
>
> Now let's change the example one more time.
>
> 1 -module(foo).
> 2 -export([zoo/0]).
> 3 bar(X) when X < 0 -> ugh(-X);
> 4 bar(X) -> X+1.
> 5 ugh(X) when X < 0 -> bar(-X);
> 6 ugh(X) -> X-1.
> 7 zoo() -> is_function(fun bar/1), is_function(fun ugh/1).
>
> ./foo.erl:7: Warning: the call to is_function/1 has no effect
>
> The functions bar/1 and ugh/1 are no more reachable than before.
> There is no possible call from the outside that will ever result in
> either function being invoked. But suddenly they are "used".
What I see here is that the function bar/1 will never be executed and
will never be called (consider code execution), but its value is used
in code that can be executed and that's something that I call "usage".
For example: if you remove the function, reachable code breaks.
So maybe this is one of the main sources of disagreement in this
thread: the strength one thinks there is in the relation between
"reachable code" and the concept of "usage".
Best regards.
Igor.
More information about the erlang-questions
mailing list