#:g1: オブジェクトは関数という考え方とLisp

Posted 2022-08-21 07:10:38 GMT

このようなツイートを目にして、そもそもLispのオブジェクト指向プログラミングはアクターから出発しているので関数適用のフォームと、メソッド適用のフォームが融合するのは或る意味必然なのではないか、と思ったりしたのですが、とはいえ、思えばCommon Lispの総称関数に至るまでに何度も再発見のようなものを繰り返している気もするので、年表にまとめて眺めてみることにしました。

1969: GEDANKEN: 関数でデータを表現する

関数でリストを表現して、それのcar/cdrを定義してみせる、ということのオリジナルは、GEDANKENなのでしょうか。

それはさておき、Plasmaの文献には、GEDANKENのような先達のアイデアを元にしたとあります。

1973: Plasma: アクター

関数でオブジェクトが表現できるという先達のアイデア+Smalltalk etcの概念が昇華してアクターになった、と個人的には理解しています。
オブジェクトと関数は、最初から融合しているような?

1975: Scheme: Plasmaを理解する試み

Plasmaを理解するために、SchemeというミニPlasmaを作製/考察し、関数とアクターは同じものなんだ!という発見をしたことが伝承されています。 しかし、Plasmaって元々そういうものだったのでは?という気もするのですが、識者のお話を伺ってみたかったり。

1979: Flavors: Smalltalkインスパイアなオブジェクト指向システム

Flavorsのメッセージ送信の構文は、(send obj msg ...)という形式ですが、Lispマシンではfuncallに細工がしてあって、(funcall obj msg ...)でもありました。
Lisp2では、(funcall obj msg ...)となりますが、Lisp1なら、(obj msg ...)なので、ここでも関数適用/メソッド適用のフォームはある程度統合されているような?
とはいえ、Smalltalkからの影響大なので、OOPはメッセージ送信構文だ、という意識が強かったと思われます。

1981: T: 関数(クロージャー)でオブジェクト指向プログラミングできる!

TはSchemeの方言ですが、オブジェクトとクロージャーの融合をベースにしたようなオブジェクト指向システムが組込まれています。
アクター系言語からの影響があるのかどうかは知らないのですが、継承機構は組込まれておらず、手動で移譲的なものを記述する形になっています。

地味に後世に影響が大きい点として、意識的に関数適用とメソッド適用のフォームの統一を図った点と、メッセージセレクタにオブジェクトが使える、という点が挙げられます。これらのアイデアは、XeroxのLOOPSチームにアイデアが取り入れられ、CommonLoopsのマルチメソッド+総称関数に繋がります。

1985: CommonLoops→Common Lisp

1984年あたりからCommon Lispのオブジェクト指向システムの検討が進みますが、先達のアイデアが合体したCommonLoopsがCommon Lispの標準に組込まれます。
以降、Lisp系のオブジェクト指向システムは総称関数ベースのもが代表的なものとされるようになります。
総称関数の解釈については、メッセージ送信ではないという人もいれば、見た目は違えどメッセージ送信(関数適用フォームとの融合+セレクターに任意のオブジェクトが使えるもの)と考える人もいるようです。

まとめ

どなたかこの辺りを掘り下げてみて欲しいところです。


HTML generated by 3bmd in LispWorks 8.0.1

comments powered by Disqus