Posted 2015-06-10 13:53:50 GMT

特異メソッド といえばRubyですが、Qiitaでこんな記事を見付けました。

この記事にもコメントしてみたのですが、 特異メソッド については、語源と日英の訳の対応がちょくちょく話題になるようです。

上記Qiitaの記事と関連してかしないでかは不明ですが、最近またTwitterで話題になっていたようです。

確か以前にも話題になって調べてなんらかの結論を出した記憶があるのですが、どうも記事にまとめてなかったのでまとめてみたいと思います。

Rubyの 特異メソッド の呼称の由来

まず、Rubyの 特異メソッド 呼称の由来ですが、Bit別冊 Common Lisp オブジェクトシステム(1989)で間違いないようです。

CLOS概説(井田昌之先生): 筆者はこうしたことのためのメソッドを特異メソッドと呼んでいる(P.18) CLOS解説: 2.10 特異メソッド(P39)

とあり、CLOS解説の方は、大久保清貴氏と、吉川昌澄氏の記事なので、この本の執筆チームで、 特異メソッド という訳語を作った、もしくは造語した可能性が高いと思われます。

では、井田先生は英語ではなんと表現しているのかなと調べてみると、common-lisp-object-systemメーリングリストでは、individual methodと表現されていますので、

特異メソッド ⇔ individual method

という対応があると思われます。

I have an experience to write methods which have several sigular points, and whose bodies are same. I feel happy if a syntax like, (defmethod foo ((x (member A B C D))) ...)

という表現もされているので、特異点(singular point 上記引用ではタイポあり)という表現が気に入っている風でもあります。

individual method については、Sonya Keene氏のObject-Oriented Programming in COMMON LISP(1989年/ISBN-10:0201175894)での用例がありますが、こちらの翻訳である、COMMON LISP オブジェクト指向(CLOS)(1991年/ISBN-10:4810180131)では、 個体メソッド と訳されているようです。

それで、そもそもの individual method の由来ですが、CLOSの大元のCOMMONLOOPS (1985)での、

II.A. Specializing to individuals individual-specific method

という表現かなと思います。

これは、 (defmethod foo ((x 'foo)) ...) みたいな形式ですが、これが汎用的になったものが、CLOSの (eql foo) という形式です。

Common Lispでの特異メソッド/individual method という用語

Common Lispで 特異メソッド も 個体メソッド も individual method もあまり耳にしたことがないなあという印象がありますが、実際調べてみるとCommon Lisp界隈ではあまり使われてはいないようです。

CLOSの仕様を議論するcommon-lisp-object-systemメーリングリストでさえ、 individual method と表現しているのは井田先生のみの様子。

それでは、何と呼んでいるのかと調べてみましたが、common-lisp-object-systemメーリングリストでは、大抵は EQL method 、Portable CommonLoops(PCL - SBCL、CMUCL等が採用)のソースコードでは、 EQL method 、 EQL specializer method 、Lucid CLでも、 EQL method 、TICLOSでは、メソッドの呼称はないものの (eql x) という形式を individual type と呼称、その他の処理系は不明、という感じで、いまいちはっきりしないながらも、 EQL method という呼称が多いようです。

Keene氏のCLOS本は、CLOSの教科書的な立ち位置かと思っていましたが、この本での呼称が広まっていないのも割合に不思議ではあります。

一方、Dylanでは

CLOSの流れを汲むDylanでは、 singleton method というようです。

書法も、

define method double (thing :: singleton(#"cup")) ... end

という風にCommon Lispのメソッドでの eql の箇所が singleton に置き換わっています。

特異メソッドと多重メソッド

一連のTwitterの議論では、 多重メソッド だと(一つに決まらないので) 特異メソッド の 特異感 が薄まるので、多重メソッド誕生前のFlavorsに起源があるのではないか、というような流れもありますが、上述のように多重メソッドのCommonLoopsが起源だと思われるのでFlavors起源ではないと思います。

一応Flavorsも調べてみましたが、 individual method という言葉はソースコードにみられるものの個別のメソッドを指しているようです。

そもそも多重メソッドでも起動するメソッドは一つのなので妙な話の気もします(Smalltalkの技法のようなDouble dispatchではないので)

まあ、この辺りは思想の違いなのかもしれません。

ついでに、Object LISPとCommonObjectsも調べてみましたが、どちらも該当するものはありませんでした。

まとめ

individual method という呼称があまり使われない理由を考えてみましたが、総称関数は、複数のメソッドを束ねているため『個別のメソッドは〜』というように言及することが多く、ややこしいからかなと推測しています。

EQL method という割り切った呼称がそれなりに定着してしまったからかもしれません。

また、そもそも総称関数なので個別のメソッドのことはあまり分けて意識しないので、呼び方も頓着していないという所かもしれません。

■

