diff --git a/demo/kitchen-sink/docs/groovy.groovy b/demo/kitchen-sink/docs/groovy.groovy index 25927bde..8097a702 100644 --- a/demo/kitchen-sink/docs/groovy.groovy +++ b/demo/kitchen-sink/docs/groovy.groovy @@ -1,26 +1,41 @@ -//http://groovy.codehaus.org/Concurrency+with+Groovy -import java.util.concurrent.atomic.AtomicInteger +//http://groovy.codehaus.org/Martin+Fowler%27s+closure+examples+in+Groovy -def counter = new AtomicInteger() - -synchronized out(message) { - println(message) +class Employee { + def name, salary + boolean manager + String toString() { return name } } -def th = Thread.start { - for( i in 1..8 ) { - sleep 30 - out "thread loop $i" - counter.incrementAndGet() - } +def emps = [new Employee(name:'Guillaume', manager:true, salary:200), + new Employee(name:'Graeme', manager:true, salary:200), + new Employee(name:'Dierk', manager:false, salary:151), + new Employee(name:'Bernd', manager:false, salary:50)] + +def managers(emps) { + emps.findAll { e -> e.isManager() } } -for( j in 1..4 ) { - sleep 50 - out "main loop $j" - counter.incrementAndGet() +assert emps[0..1] == managers(emps) // [Guillaume, Graeme] + +def highPaid(emps) { + threshold = 150 + emps.findAll { e -> e.salary > threshold } } -th.join() +assert emps[0..2] == highPaid(emps) // [Guillaume, Graeme, Dierk] -assert counter.get() == 12 \ No newline at end of file +def paidMore(amount) { + { e -> e.salary > amount} +} +def highPaid = paidMore(150) + +assert highPaid(emps[0]) // true +assert emps[0..2] == emps.findAll(highPaid) + +def filename = 'test.txt' +new File(filename).withReader{ reader -> doSomethingWith(reader) } + +def readersText +def doSomethingWith(reader) { readersText = reader.text } + +assert new File(filename).text == readersText \ No newline at end of file diff --git a/demo/kitchen-sink/docs/scala.scala b/demo/kitchen-sink/docs/scala.scala index c609a46f..f8280677 100644 --- a/demo/kitchen-sink/docs/scala.scala +++ b/demo/kitchen-sink/docs/scala.scala @@ -1,12 +1,69 @@ -//http://www.scala-lang.org/node/227 -/* Defines a new method 'sort' for array objects */ -object implicits extends Application { - implicit def arrayWrapper[A : ClassManifest](x: Array[A]) = - new { - def sort(p: (A, A) => Boolean) = { - util.Sorting.stableSort(x, p); x +// http://www.scala-lang.org/node/54 + +package examples.actors + +import scala.actors.Actor +import scala.actors.Actor._ + +abstract class PingMessage +case object Start extends PingMessage +case object SendPing extends PingMessage +case object Pong extends PingMessage + +abstract class PongMessage +case object Ping extends PongMessage +case object Stop extends PongMessage + +object pingpong extends Application { + val pong = new Pong + val ping = new Ping(100000, pong) + ping.start + pong.start + ping ! Start +} + +class Ping(count: Int, pong: Actor) extends Actor { + def act() { + println("Ping: Initializing with count "+count+": "+pong) + var pingsLeft = count + loop { + react { + case Start => + println("Ping: starting.") + pong ! Ping + pingsLeft = pingsLeft - 1 + case SendPing => + pong ! Ping + pingsLeft = pingsLeft - 1 + case Pong => + if (pingsLeft % 1000 == 0) + println("Ping: pong from: "+sender) + if (pingsLeft > 0) + self ! SendPing + else { + println("Ping: Stop.") + pong ! Stop + exit('stop) + } } } - val x = Array(2, 3, 1, 4) - println("x = "+ x.sort((x: Int, y: Int) => x < y)) + } +} + +class Pong extends Actor { + def act() { + var pongCount = 0 + loop { + react { + case Ping => + if (pongCount % 1000 == 0) + println("Pong: ping "+pongCount+" from "+sender) + sender ! Pong + pongCount = pongCount + 1 + case Stop => + println("Pong: Stop.") + exit('stop) + } + } + } } \ No newline at end of file