値を返してもらう方法

self()で自分自身のプロセスが取得出来るのでそれを相手に送ってやる。
相手側が受け取ったプロセスに送信するようになっていればそれが返信になる。

-module(ret).
-compile(export_all).

ret() -> receive P -> P!123 end.
main() ->
  S = spawn(?MODULE,ret,[]),
  S!self(),
  receive X->X end.

実行結果

> self().
<0.30.0>
> c(ret).
{ok,ret}
> ret:main().
123

それをふまえて書き直した並列ソート

-module(sort).
-compile(export_all).

pass(P,Q) -> receive X -> receive Y ->
  if X<Y -> P!X, Q!Y;
    true -> P!Y, Q!X end end end.

push() -> receive
  {P} -> receive X   -> P!X end;
  X   -> receive {P} -> P!X end end.

pop(P) -> P!{self()}, receive X->X end.

main() -> 
  A = [A1,A2,A3,A4] = [8,5,7,6],
  R = [R1,R2,R3,R4] = [spawn(?MODULE,push,[]) || _<-A],
  O1 = spawn(?MODULE,pass,[R1,R2]),
  O2 = spawn(?MODULE,pass,[R3,R4]),
  M1 = spawn(?MODULE,pass,[O1,O2]),
  I1 = spawn(?MODULE,pass,[O1,M1]),
  I2 = spawn(?MODULE,pass,[M1,O2]),
  I1!A1, I1!A2, I2!A3, I2!A4,
  [pop(P) || P<-R].

実行結果

> c(sort).
{ok,sort}
> sort:main().
[5,6,7,8]