From 7cc5c06947e40236ee16a6a09d3de524183fda86 Mon Sep 17 00:00:00 2001 From: Philipp Haller Date: Fri, 2 Feb 2007 15:17:51 +0000 Subject: Cleaned-up actor examples. --- docs/examples/actors/BoundedBufferTest.scala | 33 -------- docs/examples/actors/Joins.scala | 113 --------------------------- docs/examples/actors/Links.scala | 44 ----------- docs/examples/actors/Loop.scala | 20 ----- docs/examples/actors/Message.scala | 40 ---------- docs/examples/actors/OrElse.scala | 19 ----- docs/examples/actors/PingPong.scala | 83 -------------------- docs/examples/actors/Seq.scala | 23 ------ docs/examples/actors/boundedbuffer.scala | 36 +++++++++ docs/examples/actors/links.scala | 47 +++++++++++ docs/examples/actors/looping.scala | 28 +++++++ docs/examples/actors/message.scala | 35 +++++++++ docs/examples/actors/pingpong.scala | 75 ++++++++++++++++++ docs/examples/actors/producers.scala | 113 +++++++++++++++++++++++++++ docs/examples/actors/seq.scala | 23 ++++++ 15 files changed, 357 insertions(+), 375 deletions(-) delete mode 100644 docs/examples/actors/BoundedBufferTest.scala delete mode 100644 docs/examples/actors/Joins.scala delete mode 100644 docs/examples/actors/Links.scala delete mode 100644 docs/examples/actors/Loop.scala delete mode 100644 docs/examples/actors/Message.scala delete mode 100644 docs/examples/actors/OrElse.scala delete mode 100644 docs/examples/actors/PingPong.scala delete mode 100644 docs/examples/actors/Seq.scala create mode 100644 docs/examples/actors/boundedbuffer.scala create mode 100644 docs/examples/actors/links.scala create mode 100644 docs/examples/actors/looping.scala create mode 100644 docs/examples/actors/message.scala create mode 100644 docs/examples/actors/pingpong.scala create mode 100644 docs/examples/actors/producers.scala create mode 100644 docs/examples/actors/seq.scala (limited to 'docs') diff --git a/docs/examples/actors/BoundedBufferTest.scala b/docs/examples/actors/BoundedBufferTest.scala deleted file mode 100644 index 7585d8779a..0000000000 --- a/docs/examples/actors/BoundedBufferTest.scala +++ /dev/null @@ -1,33 +0,0 @@ -package examples.actors - -import scala.actors.Actor._ - -object boundedbuffer { - class BoundedBuffer[T](N: int) { - private case class Get - private case class Put(x: T) - - private val buffer = actor { - val buf = new Array[T](N) - var in = 0; var out = 0; var n = 0 - while(true) { - receive { - case Put(x) if n < N => - buf(in) = x; in = (in + 1) % N; n = n + 1; reply() - case Get() if n > 0 => - val r = buf(out); out = (out + 1) % N; n = n - 1; reply(r) - } - } - } - - def put(x: T): Unit = buffer !? Put(x) - - def get: T = (buffer !? Get()).asInstanceOf[T] - } - - def main(args: Array[String]) = { - val buf = new BoundedBuffer[Int](1) - buf.put(42) - scala.Console.println("" + buf.get) - } -} diff --git a/docs/examples/actors/Joins.scala b/docs/examples/actors/Joins.scala deleted file mode 100644 index 7baad9504f..0000000000 --- a/docs/examples/actors/Joins.scala +++ /dev/null @@ -1,113 +0,0 @@ -package examples.actors - -//import scala.actors.Actor -import scala.actors.Actor._ - -abstract class Producer[T] { - - /** A signal that the next value should be produced. */ - private val Next = new Object - - /** A label for an undefined state of the iterators. */ - private val Undefined = new Object - - /** A signal to stop the coordinator. */ - private val Stop = new Object - - protected def produce(x: T): unit = { - coordinator ! Some(x) - receive { case Next => } - } - protected def produceValues: unit - - def iterator = new Iterator[T] { - private var current: Any = Undefined - private def lookAhead = { - if (current == Undefined) current = coordinator !? Next - current - } - - def hasNext: boolean = lookAhead match { - case Some(x) => true - case None => { coordinator ! Stop; false } - } - - def next: T = lookAhead match { - case Some(x) => current = Undefined; x.asInstanceOf[T] - } - } - - private val coordinator /*: Actor*/ = actor { - var continue = true - while (continue) { - receive { - case Next => - producer ! Next - reply { - receive { case x: Option[_] => x } - } - case Stop => continue = false - } - } - } - - private val producer = actor { - receive { - case Next => - produceValues - coordinator ! None - } - } -} - -object producers extends Application { - - class Tree(val left: Tree, val elem: int, val right: Tree) - def node(left: Tree, elem: int, right: Tree): Tree = new Tree(left, elem, right) - def node(elem: int): Tree = node(null, elem, null) - - def tree = node(node(node(3), 4, node(6)), 8, node(node(9), 10, node(11))) - - class PreOrder(n: Tree) extends Producer[int] { - def produceValues = traverse(n) - def traverse(n: Tree) { - if (n != null) { - produce(n.elem) - traverse(n.left) - traverse(n.right) - } - } - } - - class PostOrder(n: Tree) extends Producer[int] { - def produceValues = traverse(n) - def traverse(n: Tree) { - if (n != null) { - traverse(n.left) - traverse(n.right) - produce(n.elem) - } - } - } - - class InOrder(n: Tree) extends Producer[int] { - def produceValues = traverse(n) - def traverse(n: Tree) { - if (n != null) { - traverse(n.left) - produce(n.elem) - traverse(n.right) - } - } - } - - //actor { - Console.print("PreOrder:") - for (val x <- new PreOrder(tree).iterator) Console.print(" "+x) - Console.print("\nPostOrder:") - for (val x <- new PostOrder(tree).iterator) Console.print(" "+x) - Console.print("\nInOrder:") - for (val x <- new InOrder(tree).iterator) Console.print(" "+x) - Console.print("\n") - //} -} diff --git a/docs/examples/actors/Links.scala b/docs/examples/actors/Links.scala deleted file mode 100644 index cbf69a5d0a..0000000000 --- a/docs/examples/actors/Links.scala +++ /dev/null @@ -1,44 +0,0 @@ -package examples.actors - -import scala.actors.Actor -import scala.actors.Actor._ - -case object Stop - -object Links extends Application { - - actor { - val start = link(p(2)) - start ! Stop - } - - def p(n: int): Actor = - if (n == 0) top1() - else top(p(n-1), n) - - def top(a: Actor, n: int): Actor = actor { - Console.println("starting actor " + n + " (" + Thread.currentThread() + ")") - self.trapExit = true - link(a) - while (true) { - receive { - case any => { - Console.println("Actor " + n + " received " + any) - a ! any - } - } - } - } - - def top1(): Actor = actor { - Console.println("starting last actor" + " (" + Thread.currentThread() + ")") - receive { - case Stop => - Console.println("Last actor now exiting") - exit("abnormal") - case any => - Console.println("Last actor received " + any) - top1() - } - } -} diff --git a/docs/examples/actors/Loop.scala b/docs/examples/actors/Loop.scala deleted file mode 100644 index 45270cd35d..0000000000 --- a/docs/examples/actors/Loop.scala +++ /dev/null @@ -1,20 +0,0 @@ -package examples.actors - -import scala.actors.Actor._ - -object Loop extends Application { - - case object A - - val a = actor { - loop { - react { - case A => scala.Console.println("got A") - } - } - } - - for (val i <- 0 until 10) { - a ! A - } -} diff --git a/docs/examples/actors/Message.scala b/docs/examples/actors/Message.scala deleted file mode 100644 index 8768c99c3e..0000000000 --- a/docs/examples/actors/Message.scala +++ /dev/null @@ -1,40 +0,0 @@ -package examples.actors - -import scala.actors._ -import scala.actors.Actor._ - -object Message { - def main(args: Array[String]) = { - val n = try { - Integer.parseInt(args(0)) - } - catch { - case _ => - scala.Console.println("Usage: examples.actors.Message ") - Predef.exit - } - val nActors = 500 - val finalSum = n * nActors - Scheduler.impl = new SingleThreadedScheduler - - def beh(next: Actor, sum: int): unit = - react { - case value: int => - val j = value + 1; val nsum = sum + j - if (next == null && nsum >= finalSum) { - Console.println(nsum) - System.exit(0) - } - else { - if (next != null) next ! j - beh(next, nsum) - } - } - - def actorChain(i: Int, a: Actor): Actor = - if (i > 0) actorChain(i-1, actor(beh(a, 0))) else a - - val firstActor = actorChain(nActors, null) - var i = n; while (i > 0) { firstActor ! 0; i = i-1 } - } -} diff --git a/docs/examples/actors/OrElse.scala b/docs/examples/actors/OrElse.scala deleted file mode 100644 index cd31de11a6..0000000000 --- a/docs/examples/actors/OrElse.scala +++ /dev/null @@ -1,19 +0,0 @@ -package examples.actors - -import scala.actors._ -import scala.actors.Actor._ - -object OrElse { - def main(args: Array[String]) = { - actor { - val b1 = new Channel[int] - val b2 = new Channel[int] - b2 ! 42 - val item = { b1.receive {case any => any} - } orElse { - b2.receive {case any => any} } - - Console.println("" + item) - } - } -} diff --git a/docs/examples/actors/PingPong.scala b/docs/examples/actors/PingPong.scala deleted file mode 100644 index dbc35e36a4..0000000000 --- a/docs/examples/actors/PingPong.scala +++ /dev/null @@ -1,83 +0,0 @@ -package examples.actors - -import scala.actors.Actor -import scala.actors.Actor._ - -abstract class PingMessage -case class MsgStart() extends PingMessage -case class MsgPingInit(count: int, pong: Pong) extends PingMessage -case class MsgSendPing extends PingMessage -case class MsgPong(sender: Pong) extends PingMessage - -abstract class PongMessage -case class MsgPing(sender: Ping) extends PongMessage -case class MsgStop() extends PongMessage - -object PingPong { - def main(args : Array[String]): Unit = { - val ping = new Ping - ping.start - val pong = new Pong - pong.start - ping ! MsgPingInit(100000, pong) - ping ! MsgStart - } -} - - -class Ping extends Actor { - def act(): unit = { - loop(0, null) - } - def loop(pingsLeft: int, pong: Pong): unit = { - react { - case MsgPingInit(count, pong) => { - System.out.println("Ping: Initializing with count:"+count+":"+pong) - loop(count, pong) - } - case MsgStart() => { - System.out.println("Ping: starting.") - pong ! MsgPing(this) - loop(pingsLeft-1, pong) - } - case MsgSendPing() => { - pong ! MsgPing(this) - loop(pingsLeft-1, pong) - } - case MsgPong(pidS) => { - if (pingsLeft % 100 == 0) { - System.out.println("Ping: pong from: "+pidS) - } - if (pingsLeft > 0) - this ! MsgSendPing() - else { - System.out.println("Ping: Stop.") - pong ! MsgStop() - } - loop(pingsLeft, pong) - } - } - } -} - -class Pong extends Actor { - def act(): unit = { - loop(0) - } - - def loop(pongCount: int): unit = { - react { - case MsgPing(pidPing) => { - if (pongCount % 100 == 0) { - System.out.println("Pong: ping:"+pongCount+" from: "+pidPing) - } - pidPing ! MsgPong(this) - loop(pongCount+1) - } - case MsgStop() => { - System.out.println("Pong: Stop.") - System.exit(0) - } - } - } -} diff --git a/docs/examples/actors/Seq.scala b/docs/examples/actors/Seq.scala deleted file mode 100644 index a709456f6d..0000000000 --- a/docs/examples/actors/Seq.scala +++ /dev/null @@ -1,23 +0,0 @@ -package examples.actors - -import scala.actors.Actor._ - -object Seq extends Application { - - case object A - - val a = actor { - { - react { - case A => scala.Console.println("got A") - } - () - } andThen { - react { - case A => scala.Console.println("2nd reactor got A") - } - } - } - a ! A - a ! A -} diff --git a/docs/examples/actors/boundedbuffer.scala b/docs/examples/actors/boundedbuffer.scala new file mode 100644 index 0000000000..6bc01dfe55 --- /dev/null +++ b/docs/examples/actors/boundedbuffer.scala @@ -0,0 +1,36 @@ +package examples.actors + +import scala.actors.Actor._ + +object boundedbuffer { + class BoundedBuffer[T](N: int) { + private case class Put(x: T) + private case object Get + private case object Stop + + private val buffer = actor { + val buf = new Array[T](N) + var in = 0; var out = 0; var n = 0 + loop { + receive { + case Put(x) if n < N => + buf(in) = x; in = (in + 1) % N; n = n + 1; reply() + case Get if n > 0 => + val r = buf(out); out = (out + 1) % N; n = n - 1; reply(r) + case Stop => reply(); exit("stopped") + } + } + } + + def put(x: T) { buffer !? Put(x) } + def get: T = (buffer !? Get).asInstanceOf[T] + def stop() { buffer !? Stop } + } + + def main(args: Array[String]) = { + val buf = new BoundedBuffer[Int](1) + buf.put(42) + scala.Console.println("" + buf.get) + buf.stop() + } +} diff --git a/docs/examples/actors/links.scala b/docs/examples/actors/links.scala new file mode 100644 index 0000000000..149f6db159 --- /dev/null +++ b/docs/examples/actors/links.scala @@ -0,0 +1,47 @@ +package examples.actors + +import scala.actors.{Actor, Exit} +import scala.actors.Actor._ + +object links extends Application { + + case object Stop + + actor { + val start = link(p(2)) + start ! Stop + } + + def p(n: int): Actor = + if (n == 0) top1() + else top(p(n-1), n) + + def top(a: Actor, n: int): Actor = actor { + Console.println("starting actor " + n + " (" + Thread.currentThread() + ")") + self.trapExit = true + link(a) + loop { + receive { + case ex @ Exit(from, reason) => + Console.println("Actor " + n + " received " + ex) + exit("finished") + case any => { + Console.println("Actor " + n + " received " + any) + a ! any + } + } + } + } + + def top1(): Actor = actor { + Console.println("starting last actor" + " (" + Thread.currentThread() + ")") + receive { + case Stop => + Console.println("Last actor now exiting") + exit("abnormal") + case any => + Console.println("Last actor received " + any) + top1() + } + } +} diff --git a/docs/examples/actors/looping.scala b/docs/examples/actors/looping.scala new file mode 100644 index 0000000000..805d501d11 --- /dev/null +++ b/docs/examples/actors/looping.scala @@ -0,0 +1,28 @@ +package examples.actors + +import scala.actors.Actor._ + +object looping extends Application { + + case object A + + val a = actor { + var cnt = 0 + loop { + react { + case A => + cnt = cnt + 1; + if (cnt < 10) + scala.Console.println("received A") + else { + scala.Console.println("received last A") + exit("finished") + } + } + } + } + + for (val i <- 0 until 10) { + a ! A + } +} diff --git a/docs/examples/actors/message.scala b/docs/examples/actors/message.scala new file mode 100644 index 0000000000..7b0e6387bd --- /dev/null +++ b/docs/examples/actors/message.scala @@ -0,0 +1,35 @@ +package examples.actors + +import scala.actors._; import scala.actors.Actor._ + +object message { + def main(args: Array[String]) = { + val n = try { Integer.parseInt(args(0)) } + catch { + case _ => + scala.Console.println("Usage: examples.actors.Message ") + Predef.exit + } + val nActors = 500 + val finalSum = n * nActors + Scheduler.impl = new SingleThreadedScheduler + + def beh(next: Actor, sum: int): unit = + react { + case value: int => + val j = value + 1; val nsum = sum + j + if (next == null && nsum >= finalSum) + Console.println(nsum) + else { + if (next != null) next ! j + beh(next, nsum) + } + } + + def actorChain(i: Int, a: Actor): Actor = + if (i > 0) actorChain(i-1, actor(beh(a, 0))) else a + + val firstActor = actorChain(nActors, null) + var i = n; while (i > 0) { firstActor ! 0; i = i-1 } + } +} diff --git a/docs/examples/actors/pingpong.scala b/docs/examples/actors/pingpong.scala new file mode 100644 index 0000000000..6ab43c5528 --- /dev/null +++ b/docs/examples/actors/pingpong.scala @@ -0,0 +1,75 @@ +package examples.actors + +import scala.actors.Actor +import scala.actors.Actor._ + +abstract class PingMessage +case class MsgPingInit(count: int, pong: Actor) extends PingMessage +case object MsgStart extends PingMessage +case object MsgSendPing extends PingMessage +case object MsgPong extends PingMessage + +abstract class PongMessage +case object MsgPing extends PongMessage +case object MsgStop extends PongMessage + +object pingpong { + def main(args : Array[String]) { + val ping = new Ping + ping.start + val pong = new Pong + pong.start + ping ! MsgPingInit(100000, pong) + ping ! MsgStart + } +} + +class Ping extends Actor { + def act() { + var pingsLeft = 0 + var pong: Actor = null + loop { + react { + case MsgPingInit(count, png) => + Console.println("Ping: Initializing with count "+count+": "+png) + pingsLeft = count + pong = png + case MsgStart => + Console.println("Ping: starting.") + pong ! MsgPing + pingsLeft = pingsLeft - 1 + case MsgSendPing => + pong ! MsgPing + pingsLeft = pingsLeft - 1 + case MsgPong => + if (pingsLeft % 100 == 0) + Console.println("Ping: pong from: "+sender) + if (pingsLeft > 0) + self ! MsgSendPing + else { + Console.println("Ping: Stop.") + pong ! MsgStop + exit("stop") + } + } + } + } +} + +class Pong extends Actor { + def act() { + var pongCount = 0 + loop { + react { + case MsgPing => + if (pongCount % 100 == 0) + Console.println("Pong: ping "+pongCount+" from "+sender) + sender ! MsgPong + pongCount = pongCount + 1 + case MsgStop => + Console.println("Pong: Stop.") + exit("stop") + } + } + } +} diff --git a/docs/examples/actors/producers.scala b/docs/examples/actors/producers.scala new file mode 100644 index 0000000000..7e8e34bf48 --- /dev/null +++ b/docs/examples/actors/producers.scala @@ -0,0 +1,113 @@ +package examples.actors + +import scala.actors.Actor +import scala.actors.Actor._ + +abstract class Producer[T] { + + /** A signal that the next value should be produced. */ + private val Next = new Object + + /** A label for an undefined state of the iterators. */ + private val Undefined = new Object + + /** A signal to stop the coordinator. */ + private val Stop = new Object + + protected def produce(x: T): unit = { + coordinator ! Some(x) + receive { case Next => } + } + protected def produceValues: unit + + def iterator = new Iterator[T] { + private var current: Any = Undefined + private def lookAhead = { + if (current == Undefined) current = coordinator !? Next + current + } + + def hasNext: boolean = lookAhead match { + case Some(x) => true + case None => { coordinator ! Stop; false } + } + + def next: T = lookAhead match { + case Some(x) => current = Undefined; x.asInstanceOf[T] + } + } + + private val coordinator: Actor = actor { + var continue = true + while (continue) { + receive { + case Next => + producer ! Next + reply { + receive { case x: Option[_] => x } + } + case Stop => continue = false + } + } + } + + private val producer: Actor = actor { + receive { + case Next => + produceValues + coordinator ! None + } + } +} + +object producers extends Application { + + class Tree(val left: Tree, val elem: int, val right: Tree) + def node(left: Tree, elem: int, right: Tree): Tree = new Tree(left, elem, right) + def node(elem: int): Tree = node(null, elem, null) + + def tree = node(node(node(3), 4, node(6)), 8, node(node(9), 10, node(11))) + + class PreOrder(n: Tree) extends Producer[int] { + def produceValues = traverse(n) + def traverse(n: Tree) { + if (n != null) { + produce(n.elem) + traverse(n.left) + traverse(n.right) + } + } + } + + class PostOrder(n: Tree) extends Producer[int] { + def produceValues = traverse(n) + def traverse(n: Tree) { + if (n != null) { + traverse(n.left) + traverse(n.right) + produce(n.elem) + } + } + } + + class InOrder(n: Tree) extends Producer[int] { + def produceValues = traverse(n) + def traverse(n: Tree) { + if (n != null) { + traverse(n.left) + produce(n.elem) + traverse(n.right) + } + } + } + + actor { + Console.print("PreOrder:") + for (val x <- new PreOrder(tree).iterator) Console.print(" "+x) + Console.print("\nPostOrder:") + for (val x <- new PostOrder(tree).iterator) Console.print(" "+x) + Console.print("\nInOrder:") + for (val x <- new InOrder(tree).iterator) Console.print(" "+x) + Console.print("\n") + } +} diff --git a/docs/examples/actors/seq.scala b/docs/examples/actors/seq.scala new file mode 100644 index 0000000000..e2720b4399 --- /dev/null +++ b/docs/examples/actors/seq.scala @@ -0,0 +1,23 @@ +package examples.actors + +import scala.actors.Actor._ + +object seq extends Application { + + case object A + + val a = actor { + { + react { + case A => Console.println("received A") + } + () + } andThen { + react { + case A => Console.println("received 2nd A") + } + } + } + a ! A + a ! A +} -- cgit v1.2.3