[erlang-questions] A tad confused about function parameters

Allen McPherson <>
Wed Mar 11 23:31:55 CET 2009


Here's a snippet of code that I'm using:

%%  Once nodes have been started we launch the code to execute the
%%  benchmarks.
launch(L) ->
     launch(L, []).
launch([], Pids) ->
     Pids;
launch([H|T], Pids) ->
     S = self(),             %  loop(self(), start) would evaluate  
self() inside loop() function
     launch(T, lists:append(Pids, [spawn(H, fun() -> loop(S, start)  
end)])).

%%  Main benchmark loop.  Receives request for particular type of test.
%%  Spawns code to handle benchmark on its local node.
loop(MasterPid, Mode) ->
     ...


The line in question is:
            S = self(),
----->     launch(T, lists:append(Pids, [spawn(H, fun() -> loop(S,  
start) end)])).

I find that if I use:

            launch(T, lists:append(Pids, [spawn(H, fun() ->  
loop(self(), start) end)])).

instead, self() is evaluated everywhere in loop() that MasterPid occurs.
Intuitively I sort of get it, by formally I don't really understand
what's going on here...why the delayed evaluation? I would think it  
would be
evaluate before the spawn, but it's getting evaluated after the spawn  
on node
'H'.

Probably another dumb question, but can someone shed some light this.
It seems like a fundamental concept to understand.

--
Al



More information about the erlang-questions mailing list