メッセージ+環境=クロージャ?

http://shinh.skr.jp/m/?date=20090301#p02
この話。なんか勘違いしてまったく違う話をしてそうなので一時退避。というか昨日コメントした時はさっぱり意図を掴めてなかった。

あと無理矢理Rubyの話にしてる。

obj.msg(param1, param2)

こうなってるとobjが主でparam1が従って感じになるけど、objもparam1も(もしかしたらparam2も)同等の立場の時にこれだとすっきりしないなーってことなのかしらん。多分この感覚はわかったと思う。
それでまあ例えば

param2.(param1.(obj.msg))

とあるけどこれは

msg[obj][param1][param2]

ってできるんじゃないかと。Rubyで。

msg = lambda{|o|
  lambda{|p1|
    lambda{|p2| o.msg(p1, p2) }
  }
}

1.9 なら Proc#curry が導入されたんでしたっけ。

msg = (lambda{|o, p1, p2| o.msg(p1, p2) }).curry
msg[obj][param1][param2]

まるでRuby関数型言語のようだ(高階関数使いまくりという意味で)。まあ最終的には obj.msg(param1, param2) の形が lambda の奥底に残っているのですけど。

ついでなので

even = evens.max{|a,b|a.priority <=> b.priority}
odd = odds.max{|a,b|a.priority <=> b.priority}

で max{|a,b|a.priority <=> b.priority} の部分をまとめて変数に突っ込みたかった。

これもやってみる。

by_priority = lambda{|a, b| a.priority <=> b.priority}
max = lambda{|o| o.max(&by_priority) }

even = max[evens]
odd = max[odds]

まあ手続きをまとめることはできていると思う。
一晩寝かしてまた明日勘違いしてないか考えよう。
いやまあ寝かすまでもなくこんな力技じゃなくて根本的なパラダイムの話なんだろうなとは思うのですが。