[erlang-questions] newbie: how to clear a mailbox of a process?
Bengt Kleberg
bengt.kleberg@REDACTED
Mon Jan 28 15:25:26 CET 2008
Greetings,
If you call a module with -run <module> <function> the argument will be
a list of the arguments as strings. In your example isprime/1 will be
called with a list of the string "7" (["7"]).
To make calculations you need to remove the list and turn the string
into a number.
bengt
On Mon, 2008-01-28 at 23:54 +1100, Anthony Kong wrote:
> Hi, all,
>
> Sorry, I don't think the subject line makes much sense. Hopefully if
> you read on, the example may speak for itself.
>
> I have again written a simple script:
>
> =======
>
> -module(p3).
> -export([isprime/1, test_if_divisible/2]).
>
> isprime(2) ->
> true;
>
> isprime(N) when N > 2 ->
> C = lists:seq(2, N - 1),
> process_flag(trap_exit, true),
> lists:map(fun(Div) -> spawn_link(fun() -> test_if_divisible(N, Div)
> end) end, C),
> isprime_poll(length(C)).
>
>
> isprime_poll(0) ->
> true;
> isprime_poll(NumVote) ->
> receive
> {'EXIT', _Pid, nondivisible} ->
> isprime_poll(NumVote - 1);
> {'EXIT', _Pid, divisible} ->
> false
> end.
>
>
> test_if_divisible(N, Div) ->
> case N rem Div of
> 0 -> exit(divisible);
> _ -> exit(nondivisible)
> end.
> =======
>
> The idea of this script are
> 1) in order to check if a number, says N, is a prime or not, the
> script will fire a process to test divisibility by each possible
> divisor (in the range of 2 to N - 1)
> 2) these processes are 'voting': if all these processes vote that N is
> not divisible, then N is a prime
> 3) I want to short circuit the voting process by looking for
> 'non-divisible' exit message. If I got one, the isprime_poll/1 will
> abort the tail-recursion and return false
>
> So, if I run the following tests, they produces results as expected,
> *provided* that I do not run them in one go:
>
> 2> p3:isprime(6).
> false
> ...
> (abort... then start erl again)
> ...
> 2> p3:isprime(7).
> true
>
>
> If I run like these 2 statements in the same shell, however, then what
> I got is a wrong answer for 7.
>
> 1> l(p3).
> {module,p3}
> 2> p3:isprime(6).
> false
> 3> p3:isprime(7).
> false
> 4> p3:isprime(7).
> true
>
> I believe it is because that while I make isprime_poll/1 return false
> on first 'nondivisible' message, those remaining messages sent from
> other processes are still in the mailbox. So if I immedately run
> isprime(7) after isprime(6), it'll take in these messages from last
> session and hence make a wrong conclusion.
>
> So, here is my questions:
>
> 1) Is it possible to force clearance of a process's mailbox?
> 2) What is the usual 'pattern' for implementation of a
> voting/committee algorithm?
> 3) For testing I want to run the script noninteractively using command
> line e.g. "/opt/erlang/otp-R12B-0/bin/erl -run p3 isprime 7 -s init
> stop -noshell" but I cannot get it to work. (I am getting badarith
> exception and core dump. Did I miss some parameters in the command
> line?
> 4) If I made some obvious programming mistakes, please feel free to point out
>
> Cheers,
>
> Anthony
>
>
>
>
>
More information about the erlang-questions
mailing list