並列ソート

Erlangの時のようにself()を送ってやらなくても、受け取り側でsenderに送信すれば返信になる。
メッセージを送信し返信を受け取るところまでやってくれる「!?」というメソッドがある。
受信用に「?」というメソッドがあり、それを使えばreact{}よりも簡単に書けそうな気がするが使い方がわからず。

import scala.actors._
import scala.actors.Actor._

object Ret extends Application {
  val s = actor{ react{ case x:Int => sender ! x+1 }}
  println(s !? 123)
}

実行結果

scala> :l Ret.scala

scala> Ret.main(null)
124

以上をふまえて書いた並列ソート
一応動いてるけど、最後の行をactor{}で囲むのをやめると結果が返ってこなくなる。
どこかが根本的に間違っている気がする…。

import scala.actors._
import scala.actors.Actor._

object Sort extends Application {
  def pass(p:Actor,q:Actor){
    react{ case x:Int => react{ case y:Int =>
      if(x<y){p ! x; q ! y}
         else{p ! y; q ! x}}}}

  def push(){
    react{
      case x:Int => react{ case null => sender ! x }
      case null => sender ! receive{ case x:Int => x }}}
  
  val a = List(8,5,7,6)
  val r = for(_ <- a) yield{ actor{ push() }}
  val List(r1,r2,r3,r4) = r
  val o1 = actor{ pass(r1,r2) }
  val o2 = actor{ pass(r3,r4) }
  val m1 = actor{ pass(o1,o2) }
  val i1 = actor{ pass(o1,m1) }
  val i2 = actor{ pass(m1,o2) }
  val List(a1,a2,a3,a4) = a
  i1 ! a1; i1 ! a2; i2 ! a3; i2 ! a4
  actor{ println(for(val p <- r) yield{ p !? null }) }
}

実行結果

scala> :l Sort.scala

scala> Sort.main(null)
List(5, 6, 7, 8)

参考リンク

Scala Actors -- A Short Tutorial

http://lamp.epfl.ch/~phaller/doc/ActorsTutorial.html

trait Actor in scala.actors

http://www.scala-lang.org/docu/files/api/scala/actors/Actor.html

object Actor in scala.actors

http://www.scala-lang.org/docu/files/api/scala/actors/Actor$object.html