Paste number 89961: A prime sieve

Paste number 89961: A prime sieve
Pasted by: Omnifarious
When:3 months, 2 days ago
Share:Tweet this! | http://paste.lisp.org/+1XEX
Channel:#erlang
Paste contents:
Raw Source | XML | Display As
-module(sieve).
-export([primesieve/1, primeproc/1]).

primesieve(2) ->
   [2];
primesieve(MaxToBeTested) when MaxToBeTested > 2 ->
   NextStep = spawn(sieve, primeproc, [3]),
   [2 | primesieve(3, NextStep, MaxToBeTested)].

primesieve(CurNum, NextStep, MaxToBeTested) when CurNum < MaxToBeTested ->
   NextStep ! CurNum,
   primesieve(CurNum + 2, NextStep, MaxToBeTested);
primesieve(_, NextStep, _) ->
   NextStep ! {finished, self()},
   receive
      {result, Result} ->
         Result
   end.

primeproc(Starting) ->
   receive
      {finished, Parent} ->
         Parent ! {result, [Starting]};
      CurNum when CurNum rem Starting == 0 ->
         primeproc(Starting);
      CurNum ->
         primeproc(Starting, spawn(sieve, primeproc, [CurNum]))
   end.

primeproc(Starting, NextStep) ->
   receive
      {finished, Parent} ->
         NextStep ! {finished, self()},
         receive
            {result, Result} ->
               Parent ! {result, [Starting | Result]}
         end;
      CurNum when CurNum rem Starting == 0 ->
         primeproc(Starting, NextStep);
      CurNum ->
         NextStep ! CurNum,
         primeproc(Starting, NextStep)
   end.

This paste has no annotations.

Colorize as:
Show Line Numbers

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.