世界のナベアツに Ruby で挑戦(sumim 版)

すばらしい! 自分なりにも、Squeak Smalltalk 版からの移植っぽいやつを考えてみました(「#アホに」はお借りしました…)。Ruby は、ブロックがオブジェクトじゃないのがつらいですね(^_^;)。あと、Rubinius Ruby でなくとも動かせるように、実行時コンテキストをたぐるギミックは無しにして、代わりにグローバル変数を使っています。

#!/usr/bin/ruby -Ku

class Object; alias :、 :proc end

class FalseClass
  def と; yield end
  def の時だけ(シンボル); end
end

class TrueClass
  def と; self end
  def の時だけ(シンボル); シンボル end
end

class Integer
  def から(終わり); self..終わり end
  def の倍数; $各々 % self == 0 end
  def がつく数字; $各々.to_s.include?(to_s) end
  def の読み
    raise "ギブ" if self >= 1e4
    case self
    when 0; ''
    when 1..9; %w[いち に さん よん ご ろく なな はち きゅう][self-1]
    else
      残り = self
      ['', 'じゅう', 'ひゃく', 'せん'].inject(''){ |結果,小位|
      桁数字 = 残り % 10; 残り = 残り / 10
      桁数字 == 0 ? 結果 :
        ((桁数字 == 1 and !小位.empty?) ? '' : 桁数字.の読み) + 小位 + 結果 }
    end
  end
end

module Enumerable
  def なります; self end
  def なって(&すること); self << すること end

  def まで数えて(すること群)
    each{ |各々|
      $各々 = 各々
      メソッド名群 = すること群.collect{ |すること| すること.call }
        出力 = メソッド名群.compact.inject(''){ |結果,メソッド名|
        結果 = 各々.の読み if 結果.empty?
        結果.send(メソッド名)
      }
      puts 出力.empty? ? 各々 : 出力
    }
  end
end

class String
  def アホに; sub(/\A./){ $& + '' } end
  def 犬っぽく; self + 'バフッ' end

  def 気持ちよく
    self + case scan(//).last
      when ''; ''
      when '', ''; ''
      when '', '', ''; ''
      when ''; ''
      else ''
      end + '〜〜ッ'
  end
end

class Proc
  def なって(&すること); [self, すること] end
  def なります; [self] end
end

#1.から(40).まで数えて 、{3.の倍数.と{3.がつく数字}.の時だけ:アホに}.なります