最近のキーワード

2006年05月30日

ブロックの合成

「Rubyで(ブロック付きのメソッドを)関数合成をするには?」を受けて、次のようなスクリプトを書いてみた。ただし、ruby-1.9でないと動きません。 思いつくままに書いたけど、いまいち巧くないような気がしてきた。あとは、以前書いたrec.rbのy_combY.rbのように再帰っぽいことが書ければいいと。 (追記:以下をさらに改良したものが「ブロックの合成(その3:再帰編)」にあります。)
def foo
  puts "foo"
  yield
end

def foo1(x)
  puts "foo(#{x})"
  yield
end

def foo2(x, y)
  puts "foo(#{x}, #{y})"
  yield
end

def bar
  puts "bar"
  yield
end

def baz
  puts "baz"
  yield
end

module BlockComposition
  def <<(other)
    Proc.new{|*args,&block|
      self.call(*args){ other.call(&block) }
    }
  end

  def +(arg)
    Proc.new{|*args,&block|
      self.call(arg,*args,&block)
    }
  end

  def /(filter)
    Proc.new{|*args,&block|
      self.call(*(filter.call(*args)), &block)
    }
  end

  def >>(other)
    Proc.new{|*args,&block|
      other.call{ self.call(&block) }
    }
  end

  def |(other)
    Proc.new{|*args,&block|
      self.call(*args, &block)
      other.call(*args, &block)
    }
  end
end

class Proc
  include BlockComposition
end
class Method
  include BlockComposition
end

x = 0
counter = proc{ x = x + 1 }

(method(:foo) << method(:bar) << method(:baz)).call{ puts "hello" }
(method(:foo)|method(:bar)|method(:baz)).call{ puts "hello" }
(method(:foo2)+1+2).call{ puts "hello" }
posted by ttate at 04:17| 🌁| Comment(0) | TrackBack(0) | Ruby | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。