I have a module "a" defining callback "c":
-module (a).
-callback c (integer()) -> integer().
Now, I have callback module "b" implementing invalid (non-comforming the
a:c/1 spec) callback "c":
-module (b).
-behavior (a).
-export ([c/1]).
c (A) when is_atom(A) ->
A.
Now, I dialyze both modules:
$ dialyze -n --src a.erl b.erl
which outputs:
Proceeding with analysis... done in 0m0.64s
done (passed successfully)
What I've expected is the dialyzer warning about invalid b:c/1 function
(something about breaking the contract for c/1). Am I right?
-- D.
_______________________________________________
erlang-questions mailing list
erlang-q...@erlang.org
http://erlang.org/mailman/listinfo/erlang-questions
Wow, It's a miracle! I've just found the answer and (what I understand)
a bug. IT IS "-behavior (...)" which is perfectly understood by the
compiler but not by by the dialyzer! Dialyzer expects "-behaviour (...)"
(note the different spelling).
This is not a bug. Erlang has always used 'behaviour' (and
'behaviour_info'). See
http://en.wikipedia.org/wiki/American_and_British_English_spelling_differences#-our.2C_-or
As a side note, Erlang allows for any user defined elements starting with -.
If you for example add the following line to your code
-my_own_local_thing(whatever_data).
then this is fully legal Erlang, and its effect is seen if you run
Module:module_info()
[...
{attributes,[{behaviour,[supervisor]},
{my_own_local_thing,[whatever_data]}]},
...]
Cheers,
Daniel
From Erlang Reference Manual:
"""
-behaviour(Behaviour).
The atom Behaviour gives the name of the behaviour, which can be a user
defined behaviour or one of the OTP standard behaviours gen_server,
gen_fsm, gen_event or supervisor.
The spelling behavior is also accepted."""" <--- HERE
It's a bug. Besides as I mentioned, the compiler perfectly understand
the attribute "-behavior" giving me warnings about missing callbacks.
So, compiler understand and behave correctly with "-behavior" -
dialyzer don't.
(Unfortunately (or maybe not) my code if full of "behaviors" ;) just
because it is accepted and understood not even deprecated).
-- D.
I've just looked into "Erlang. Programming" by Cesarini & Thompson
(2009), page 271, an example of gen_server (usr.el listining):
(...)
-behavior(gen_server).
(...)
Well, thats enough for me to be completely comvinced it's not a weird
thing to write "-behavior (...)". I think it's in common, especially
for Americans.
I wrote the first prototype for user-defined behaviors, and no one noticed that I had used American spelling, until it was pointed out much later, after the official release. :)
BR,
Ulf W
Thanx.
B.regards,