scala/ScalaBook/chapter-03/genStack2.scala
class emptyStack extends Exception
abstract class Stack[Q]
case object EmptyStack extends Stack[Any]
case class StackC[Q](e: Q, s: Stack[Q]) extends Stack[Q] {
def push(x : Q) = new StackC[Q](x, new StackC[Q](e,s))
def pop = this match {
case StackC(_,StackC(e1,s1)) => new StackC(e1,s1)
case StackC(_, s2) => s2
case _ => throw new Exception
}
def top = e
}
val q1 = StackC(3,StackC(4,StackC(5, EmptyStack)))
println(q1)
val q2 = q1.pop
println(q2)
val q3 = q2.pop
println(q3)
val q4 = q3.push(9)
println(q4)