並列ソート

練習に4要素の並列ソートをやってみる。
ソート結果を再びリストにまとめ上げるやりかたが思いつかなかったので、
とりあえず何番目はいくつですよ、というのをわかった順に表示するだけ…。

-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.

output(M,N) -> receive X -> receive Y ->
  if X<Y -> p(M,X), p(N,Y);
    true -> p(M,Y), p(N,X) end end end.

p(K,V) -> io:format("~nvalue at ~w is ~w ",[K,V]).

main() -> 
  [A,B,C,D] = [8,5,7,6],
  O1 = spawn(?MODULE,output,[1,2]),
  O2 = spawn(?MODULE,output,[3,4]),
  M1 = spawn(?MODULE,pass,[O1,O2]),
  I1 = spawn(?MODULE,pass,[O1,M1]),
  I2 = spawn(?MODULE,pass,[M1,O2]),
  I1!A, I1!B, I2!C, I2!D.

実行結果

> c(sort).
{ok,sort}
> sort:main().
6
value at 3 is 7 
value at 1 is 5 
value at 4 is 8 
value at 2 is 6

メッセージ送信演算の返値は送信メッセージ自体になる。
6と表示されているのは、mainの最後の式であるI2!DのDの値が6であるため。