tags:

views:

64

answers:

1

I'm reading Programming Erlang by Joe Armstrong(Pragmatic Bookshelf). In name_server.erl source code on Chapter 16, Where's Dict variable from? Calling dict:new() generates Dict automatically? And, reference says that dict:new() creates dictionary. Don't I need to store it as a variable like Dict = dict:new()?

-module(name_server).
-export([init/0, add/2, whereis/1, handle/2]).
-import(server1, [rpc/2]).

add(Name, Place)  ->
  rpc(name_server, {add, Name, Place}).

whereis(Name) ->
  rpc(name_server, {whereis, Name}).

init()  ->
  dict:new().

handle({add, Name, Place}, Dict)  ->
  {ok, dict:store(Name, Place, Dict)};
handle({whereis, Name}, Dict) ->
  {dict:find(Name, Dict), Dict}.
+3  A: 

This is part of a two file example. The other file (immediately before it in the book) is server.erl. It contains a loop function that calls the handle function in name_server.erl (or whatever module you pass to it):

The line is:

{Response, State1} = Mod:handle(Request, State),

where Mod is the module passed to start earlier. And State is initialised earlier as Mod:init() in the start function.

So State is initialised to name_server:init() which in your file returns dict:new(). However, as loop is called recursively State will take the next value of State1.

So when handle is called, Dict is set to the current value of State.

Muhammad Alkarouri