blob: 80c26641305e676e5cc3a45e93fd1c8f4e3beb6a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
/**
* @author Philipp Haller <philipp.haller@epfl.ch>
*
* This shows "customer passing" for implementing
* recursive algorithms using actors.
*/
package examples.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
}
}
|