[erlang-questions] Erlang/OTP R15B has been released

Kostis Sagonas kostis@REDACTED
Thu Dec 15 11:39:52 CET 2011

On 12/14/2011 06:05 PM, Kenny Stone wrote:
> How do "behaviour callbacks" differ from the way it used to work?

In a nutshell, behaviour callbacks allow behaviour modules to specify 
(using a formal language, instead of just in comments) the names and 
types of all functions that callback modules should implement. This 
information can then be processed by dialyzer (but in the future 
presumably also by other tools, e.g. edoc) to check conformance of a 
callback module with what the behaviour module expects and warn the user 
for errors that may exist.

The syntax of -callback attributes is the same as that of -spec 
attributes. The main difference is that -callback attributes refer to 
functions that do not belong to the module containing them (and cannot 
be found in its code) but to the callback module(s).

Note the callback module can provide more specific implementations of 
what the behaviour module expects. For example, a gen_server expects 
that the callback module exports an init/1 function. In R15B, the 
relevant callback attribute reads:

   -callback init(Args :: term()) ->
       {ok, State :: term()} |
       {ok, State :: term(), timeout() | hibernate} |
       {stop, Reason :: term()} | ignore.

but a specific callback module may decide to provide an init function 
that accepts an empty list as Args and only returns {ok, State}.  Thus, 
in the callback module, one may want to provide the following spec:

   -spec init([]) -> {ok, state()}.

for some locally defined state() type.


PS. We'll try to add this in Section 1.2 of the OTP Design Principles
User's Guide.  Currently, some of this info has been added in a weird 
place of the Guide that is hard to find...  Apologies for this.

More information about the erlang-questions mailing list