並列ソート
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