diff options
author | Philipp Haller <hallerp@gmail.com> | 2006-06-21 12:35:21 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2006-06-21 12:35:21 +0000 |
commit | 0d8b14c6055e76c0bff3b65d0f428d711abe1f5a (patch) | |
tree | 70d30af5d460a943d17d2953041412b79814a2af /docs/examples/actors/customer.scala | |
parent | 3fe40a93ffda8571721ff574469171c633191fc4 (diff) | |
download | scala-0d8b14c6055e76c0bff3b65d0f428d711abe1f5a.tar.gz scala-0d8b14c6055e76c0bff3b65d0f428d711abe1f5a.tar.bz2 scala-0d8b14c6055e76c0bff3b65d0f428d711abe1f5a.zip |
Added actors library.
Diffstat (limited to 'docs/examples/actors/customer.scala')
-rw-r--r-- | docs/examples/actors/customer.scala | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/docs/examples/actors/customer.scala b/docs/examples/actors/customer.scala new file mode 100644 index 0000000000..64453aee16 --- /dev/null +++ b/docs/examples/actors/customer.scala @@ -0,0 +1,66 @@ +/** + @author Philipp Haller <philipp.haller@epfl.ch> + + This shows "customer passing" for implementing + recursive algorithms using actors. + */ + +import scala.actors._; +import scala.actors.single._; + +abstract class FactorialMessage; +case class Factorial(n: int, resTo: Actor) extends FactorialMessage; +case class Value(n: int) extends FactorialMessage; + +class FactorialProcess extends Actor { + override def run: unit = { + receive { + case Factorial(n, resTo) => + if (n == 0) { + Debug.info("Sending Value(1) to " + resTo) + resTo send Value(1) + } + else { + // spawn process that multiplies + /*val m = spawnReceive({ + case Value(value) => resTo send Value(n * value) + });*/ + + val m = new MultiplyActor(n, resTo) + m.start + Debug.info("Sending Factorial(" + (n-1) + ", " + m + ") to " + this) + this send Factorial(n-1, m) + } + run + } + } +} + +class MultiplyActor(factor: int, resTo: Actor) extends Actor { + override def run: unit = + receive { + case Value(value) => + Debug.info("Sending Value(" + factor * value + ") to " + resTo) + resTo send Value(factor * value) + Debug.info("Done sending.") + } +} + +object CustomerPassing { + def main(args: Array[String]): unit = { + val fac = new FactorialProcess + fac.start + + val c = new Actor { + override def run: unit = { + fac send Factorial(3, this) + + receive { + case Value(value) => + System.out.println("Result: " + value) + } + } + } + c.start + } +} |