kiyokaのブログアーカイブ

Archive of old blog posts

Rubyのメソッドはファーストクラスオブジェクトだった

Yuguiさんのエントリーより引用 ファーストクラスオブジェクトとしてのメソッド - 世界線航跡蔵 やー、Rubyのメソッドはファーストクラスですよ。返り値にできて、変数に格 納して演算できて、引数にできるという意味では。 確かに、RubyはPythonやJavaScriptやSchemeに比べると高階関数を陽に使うプ ログラミング*1 は不格好になる。Pythonなら簡単なのに、

   bound_function = obj.hoge
   bound_function(arg1, arg2, arg3)

Rubyは余計なメソッド呼び出しがくっついて不格好だ。

   method = obj.method(:hoge)
   method.call(arg1, arg2, arg3)

私もこの点が気にくわなくてまつもとさんに「メソッドがファーストクラスだっ たらいいのに」と言ったことがある。でも、まつもとさんの考えではすでに ファーストクラスということだった。

名前空間 もう細かいところは記憶が定かでないので、以下は私の理解になる。メソッド はただ、名前空間が違うんだ。 既存のメソッドと同名の識別子に値を代入すると、それはローカル変数の初期 化になる。けれども、メソッド呼び出しでは依然として元のメソッドを参照す る。

   p = 1
   p p #=> 1

Matzさんのブログより引用 Matzにっき(2008-02-01) Lisp-1とLisp-2 ここで説明もなくLisp-1とかLisp-2とか書いたが、そういえば日本語であまり この用語を見たことがないので補足しておく。 基本的に名前空間が一つしかないLispのことをLisp-1と呼ぶ。たとえばSchemeがそう。 (略) Lisp-1とLisp2の区別はLisp以外のプログラミング言語でも存在する。たとえ ば、PythonやJavaScriptはLisp-1であり、 RubyはLisp-2である。 ということで、RubyはLisp-2だから識別子に入れた手続きを呼びだすために callメソッドがが容易されているという理解。

これが分かれば、[Nendo]からRubyのメソッドを呼びだす文法が正しく定義できそうだ。 もうちょっとでメソッドと識別子に登録されたProcオブジェクトは全く別物だと勘違いするところだった。

こういうエントリーもある。 Rubyの呼び出し可能オブジェクトの比較(1) - 世界線航跡蔵 [Nendo]の開発にはドンピシャの情報。Yuguiさんすばらしい。ありがたや。