scala/ScalaBook/chapter-07/actors5.scala

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

case class Val(a: Actor, n: Int)
case class Res(n: Int)
class Fact extends Actor {
  def act =
    react {
      case Val(a,0) => a ! Res(1)
      case Val(a,n) => 
        var p = new Fact
        p.start
        p ! Val(self,n-1)
        react { case Val(_, m) => a ! Val(a, n*m) 
                case Res(m)    => a ! Val(a, n*m)} 
    } 
}

object actorsExample {
  def main(args: Array[String]) {
    var factorial = actor {
      react {
        case Val(a,n) =>
          var q = new Fact
          q.start
          q ! Val(self,n)
          react { case Val(_,f) => a ! Val(a,f) }
      }
    }
    factorial ! Val(self,6)
    react { case Val(_, n) => println(n) }
  }
}