作者: Bruce.
日時: 2008/7/23(01:49)
Bruce.です。

Yukihiro Matsumoto さんは書きました (2008/07/23 0:48):
> まつもと ゆきひろです

> |Rubyにおいては関数(関数オブジェクト)は要件を満たしていないので、
> |first-class object ではありません。
> 
> 断言されちゃいましたが、ここでいうfirst-class objectの要件っ
> てなんなんですかね。

というツッコミを受けましたので、あらためて調べなおしてみると
どうも定義(要件)に多少のゆれがあるみたいですね。

わたしが、Rubyにおいて関数(いや、厳密な意味での関数はないというのは
とりあえずスルーしていただいて)がそうでないと判断したのは、第一に

First-class object - Wikipedia, the free encyclopedia
"Depending on the language, this can imply:

    * being expressible as an anonymous literal value
    * being storable in variables
    * being storable in data structures
    * having an intrinsic identity (independent of any given name)
    * being comparable for equality with other entities
    * being passable as a parameter to a procedure/function
    * being returnable as the result of a procedure/function
    * being constructible at runtime
    * being printable
    * being readable
    * being transmissible among distributed processes
    * being storable outside running processes"

http://en.wikipedia.org/wiki/First-class_object

でいう、変数に対して代入できないという点からです。
とすると lambda やら -> のアレは代入できるではないか、というと
まあそうですねえ(^^;

でも呼び出すときに .call とかしないといけないですよね。
その手間が定義を満たすかどうかにかかわるのかはちょっとわかりませんけど。

irb(main):002:0> ->(x) { x*x}.call(3)
=> 9
irb(main):003:0> f = ->(x) { x*x}
=> #<Proc:0xb67650@(irb):3 (lambda)>
irb(main):004:0> f.call(9)
=> 81
irb(main):005:0>

といったところでいかがでしょうか。

-- 
木村浩一
  I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?
  mail kbk [at] kt.rim.or.jp
        web  www.kt.rim.or.jp/~kbk/zakkicho/
             homepage3.nifty.com/farstar/