世界のナベアツに“はじめての Scala”で果敢に挑戦


リファレンスをひきひき…(^_^;)。

こんなふうに書いた方がシンプルだよ…とか教えていただければさいわいです。

object Nabeatsu {

  def main(args: Array[String]) {
//  1 から 40 まで数えて((3の倍数)と(3がつく数字)の時だけ"アホに"なります)
    1 から 40 まで数えて(
      (3の倍数)と(3がつく数字)の時だけ"アホに"なって(
      (5の倍数)の時だけ"犬っぽく"なって(
      (8の倍数)の時だけ"気持ちよく"なります)))
  }

  class 範囲生成用(始め: Int) {
    def から(終わり: Int) = 始め to 終わり
  }

  class 範囲用(範囲: Range) {
    def まで数えて(すること群: List[Int => String]) = {
      val メソッド群 = Nabeatsu.getClass.getDeclaredMethods
      範囲.foreach(各々 => {
        val メソッド名群 = すること群.map(すること => すること(各々))
        val 出力 = メソッド名群.foldLeft(""){(結果, メソッド名) => 
          if (メソッド名 != "") {
            val メソッド = メソッド群.filter(_.getName == メソッド名)(0)
            メソッド.invoke(Nabeatsu, Array(
              if (結果 == "") 各々.の読み else 結果)
            ).asInstanceOf[String]
          } else 結果
        }
        println( if (出力 == "") 各々.toString else 出力 )
      })
    }
  }

  class 整数用(整数: Int) {
    def の倍数 = (数値: Int) => 数値 % 整数 == 0
    def がつく数字 = 
      (数値: Int) => 数値.toString.indexOf(整数.toString) > -1
    def の読み:String = 整数 match {
      case _ if (整数 >= 10000) => throw new RuntimeException("ギブ")
      case _ if (整数 < 0) => ""
      case _ if (整数 < 10) => Array("", "いち", "に", "さん", 
          "よん", "ご", "ろく", "なな", "はち", "きゅう")(整数)
      case _ => {
        var 残り = 整数
        Array("", "じゅう", "ひゃく", "せん").foldLeft(""){
          (結果: String, 小位: String) => {
            var 桁数字 = 残り % 10; 残り = 残り / 10
            if (桁数字 == 0) 結果 else
              (if (桁数字 == 1 && 小位 != "") "" else 桁数字.の読み) + 小位 + 結果
          }
        }
      }
    }
  }

  class 条件式用(条件: (Int) => Boolean) {
    def と(別の条件: (Int) => Boolean) = (数値: Int) => 条件(数値) || 別の条件(数値)
    def の時だけ(すること: String) = (数値: Int) => if (条件(数値)) すること else ""
  }
  
  class すること用(チェック: (Int) => String) {
    type T = (Int) => String
//  def なって(別のチェック: T) = チェック :: 別のチェック :: Nil
    def なって(別のチェック群: List[T]) = チェック :: 別のチェック群
    def なります = チェック :: Nil
  }
  
  def アホに(文字列: String) = {
    val リスト = 文字列.toList
    (リスト.head :: '〜' :: リスト.tail)
      .foldLeft(""){(結果,各々) => 結果 + 各々.toString}
  }
  
  def 犬っぽく(文字列: String) = 文字列 + "バウッ"
  
  def 気持ちよく(文字列: String) = 文字列 + (文字列.toList.last match {
    case 'な' => "ぁ"
    case 'ち'|'に' => "ぃ"
    case 'く'|'う'|'ッ' => "ぅ"
    case 'ご' => "ぉ'"
    case _ => ""}) + "〜〜ッ"

  implicit def 範囲生成用へ(値: Int) = new 範囲生成用(値)
  implicit def 範囲用へ(範囲: Range) = new 範囲用(範囲)
  implicit def 整数用へ(整数: Int) = new 整数用(整数)
  implicit def 条件式用へ(関数: (Int) => Boolean) = new 条件式用(関数)
  implicit def すること用へ(関数: (Int) => String) = new すること用(関数)
}