scala/ScalaBook/chapter-07/actors5.scala.orig

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

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

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