Question about fun's

Martin Bjorklund <>
Wed Jan 27 22:08:33 CET 1999


Shawn Pearce <> wrote:

> Essentially parts of the system will need to invoke code on some
> plugin module whose name isn't known until runtime, and even then
> will change on invoctions.

This is a pretty common situation in generic Erlang programs - use a
callback module (which may change dynamically) and call a certain
function in that module at certain occasions.  One example is the
module gen_server, which implements a generic server process.  The
server is given the name of a callback module when the process is
started.  For each request the server receives, a function in the
callback module is called:


-module(gs).

start(Mod) -> spawn(gs, init, [Mod]).

init(Mod) ->
   InitState = Mod:init(),
   loop(Mod, InitState).

loop(Mod, State) ->
   receive
      {request, From, Req} ->
          {Reply, NewState} = Mod:handle_request(Req, State),
          From ! Reply,
          loop(Mod, NewState);
      {change_module, NewMod} ->
          loop(NewMod, NewState)
  end.


-module(callback1).

init() -> [];

handle_request({append, Item}, State) ->
  {ok, State ++ Item};

handle_request(print, State) ->
  io:format("~p", [State]),
  {ok, State}.


etc.



> We'll implement each class in its own module, but we really sort of need the
> ability to have methods dispatched based on the class at runtime, rather than
> at the time of the coding.

Mod:handle_request(Mod) is an example of that.  It is just a syntactic
sugar for apply(Mod, handle_request, [Mod]).

Also, the function name could be dynamic:

Mod:Fun(...)   works just fine.



/martin



More information about the erlang-questions mailing list