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)