case class Kid(name:String) class FunnyGame { var member = List[Kid]() def attend(kid:Kid) = { member = kid :: member } } object Suneo extends Kid("Suneo") { val game = new FunnyGame def attend(kids:List[Kid]) = { val list = tailingNobita(kids) list.foreach { kid => kid match { case Suneo => game.attend(Suneo) println(Suneo.name+":僕はもちろん参加ね。") case kid if kid != Kid("Nobita") => game.attend(kid) println(Suneo.name+":大歓迎だよ"+kid.name+"!") case kid => println(Suneo.name+":悪いな"+kid.name+"、このゲーム" +game.member.length+"人用なんだ。") } } } def tailingNobita(kids:List[Kid]):List[Kid] = kids match { case kid :: kids if kid == Kid("Nobita") => tailingNobita(kids) ++ List(kid) case kid :: kids => kid :: tailingNobita(kids) case Nil => Nil } } object ExceptNobita { def main(args:Array[String]) { val kidNames = List[String]() ++ args val kids = Suneo :: getKids(kidNames) Suneo.attend(kids) } def getKids(names:List[String]):List[Kid] = names match { case kid :: kids => Kid(kid) :: getKids(kids) case Nil => Nil } }