[erlang-questions] wierd "function not used" problem - code included
deepblue_other
cktgatb@REDACTED
Mon Oct 6 17:21:56 CEST 2008
Edwin Fine wrote:
>
>
> deepblue_other wrote:
>>
>> so when I want to use spawn_link() with a named function that function
>> has to be exported?
>> same stands for regular spawn()?
>>
> Yes, if you use a spawn that takes Module, Function, Args, like spawn/3,
> spawn/4, spawn_link/3, spawn_link/4,.... Or apply/3. And so on.
>
> In general if you provide a so-called "MFA" (Module, Func, Args) to a
> function, the Func has to be exported from Module, even if the Func is
> only for internal use within Module.
>
> It's important to know that the shell is your friend. It's critical to try
> out little pieces of code in the shell to see if they work the way you
> expect. For example, if you wanted to see if spawn could see your
> data_process function, you could have tried it in the shell (I'm passing
> the atom 'junk' instead of a real socket because I know the call will fail
> because it's not exported, so the socket is not needed):
>
> 1> c(tcp_manager).
> ./tcp_manager.erl:33: Warning: function data_process/2 is unused
> {ok,tcp_manager}
> 2> spawn(tcp_manager, data_process, [junk, []]).
> <0.40.0>
> 3>
> =ERROR REPORT==== 5-Oct-2008::20:49:23 ===
> Error in process <0.40.0> with exit value:
> {undef,[{tcp_manager,data_process,[junk,[]]}]}
>
> deepblue_other wrote:
>>
>> just a side question:
>> once a certain "receive" configuration is set for a process it can never
>> be changed to another "receive" configuration? it just popped in my head
>> here when you said that i can inline the error "receive".
>>
>
> I perhaps did not make myself clear. What I meant by saying you could
> inline it is that I didn't see the value of writing
>
> Fun = fun() -> do_something(), do_something_else() end,
> Fun().
>
> That's the same as writing
>
> do_something(),
> do_something_else()
>
no I understood what you wanted to say, I just had a case in my mind where
for example a "receive configuration" is active for a process, and a message
that matches comes in, and the clause starts executing its expressions and
one of the expressions calls another function that within it contains
another "receive configuration" - the new configuration would now be active,
and the old one would stop?
also the expressions listed bellow a "receive configuration" are executed
even though the "receive" essentially blocks the process in waiting state?
as you can tell Im slightly confused as to how the "receive" affects the
present/future activity of a process
Edwin Fine wrote:
>
> It is better in this case to put the code into a separate function.
> Better, because you can hot-swap the code and change that function.
>
> There's an excellent article about hot code swapping
> http://http://spawnlink.com/articles/rules-of-hot-code-swapping/ here .
>
I will read this through now
Edwin Fine wrote:
>
>
>
>> %-----------------------------------------------
>> Listen_for_errors =
>> fun() ->
>> io:format("listening started~n"),
>> receive
>> {'EXIT', Pid, Why} ->
>> io:format("~p exited because:~p", [Pid,Why]);
>> Other ->
>> io:format("Other:~p~n", [Other])
>> end
>> end,
>> Listen_for_errors(),
>> %-----------------------------------------------
>>
> Finally, I'm not sure what Listen_for_errors() is supposed to do. It's
> just going to sit there forever in the receive, waiting for the first
> message that is sent (or en exit signal), and print it out (thus throwing
> it away), and return. What did you want it to do?
>
Listen_for_errors() was meant to catch the errors that were produced because
I didnt export the function I used in spawn_link() :) and just to see if the
data was coming in from the client.
thanks Edwin
--
View this message in context: http://www.nabble.com/wierd-%22function-not-used%22-problem---code-included-tp19826465p19840082.html
Sent from the Erlang Questions mailing list archive at Nabble.com.
More information about the erlang-questions
mailing list