scala/ScalaBook/chapter-03/sexp.scala

abstract class SExp                         
case object NilSExp extends SExp
case class Atom(elem: Char) extends SExp
case class Pair(left : SExp, 
                right: SExp) extends SExp

//
val NIL = 0
val ATOM = 1
val PAIR = 2
//
def createSExp() : SExp = {
  println("Enter choice...")
  println("0 for NIL");
  println("1 for ATOM");
  print("2 for PAIR\n? ");
  val choice : Int = readInt()
  if (choice == NIL)
    return NilSExp
  else if (choice == ATOM) { 
    print("Enter atom...\n? ");
    val s : Char = readChar()
    return Atom(s)
  }
  else 
    return Pair(createSExp(),createSExp())
}

def printSExp(s : SExp): Unit = 
  s match {
    case NilSExp   => print("nil")
    case Atom(a)   => print(a)
    case Pair(l,r) => print("(")
                      printSExp(l)
                      print(",")
                      printSExp(r)
                      print(")")
  } 

  var s:SExp = createSExp()
  println()
  printSExp(s)
  println()