ネットワーク指向プログラミング 2

 うんこをしてきた。

 スタックの遷移をトレースしたものが木なわけだろ。

 何をトレースすればネットワークになる? 関数に変わるものはなんだ?

 まず確実に存在するのがノードだ。移動するたびにノードは積み上げられていくわけだが、終わりのないプログラムである以上積み上げすぎればいずれ溢れる。だからといってグローバルに置いたものを共有しては確実に破綻する。

 ノードがある処理をする。そして不完全なxが出来る。xは次に移動したノードで処理されることが期待される。

 次のノードBでは、ネットワーク指向であるかゆえにあらゆるところからそこに移動してきうる。不完全なxが来るのか、不完全なyが来るのか分かったものではない。だがノードは同じことをする。それは同一性の定義だ。だからノードBは相手がxであろうとyであろうと、なんらかの処理を行うメソッドBを呼び出す。おそらくそこで使われるのはダックタイピングだ。それは完結せず正しい結果を返しもしない。不完全なxb、不完全なybが出来る。

 そして次のノードに移動する。確率的に移動するのか、入力を必要とするのか、それは分からないが少なくとも一箇所に移動するのでないことは確かだ。ある条件を満たすならばある場所に移動する、というわけでもない。好きな場所に移動するのだ。

 アウトラインは固まった。さて、不完全だがあらゆるメソッドの呼び出しが可能な万能型とでもいうべき型が必要なことがわかった。それは入力され出力される。

 IEnumerableと考えてみる。それはstringの集合だが、順序を持たない。キーも持たず適当な順番で列挙される。string配列から乱数をインデックスにして適当にstringを取ってくるような感じだ。列挙に終わりはないのでforeachしたらおしまいだ。ただし適当な場所にインサートすることが出来る。

 この条件を満たすデータ構造は、ランダムアクセスが可能で、ランダムな場所にインサートが可能な、配列と連結リストの性質を併せ持ったものになる。そんなことを効率的に出来るデータ構造はないので、とりあえずvectorを使ってお茶を濁すことにする。このデータ構造こそが、ネットワーク指向プログラミングのベースとなるにふさわしいことは明らかだろう。関数におけるスタックは、ネットワークにおけるこのなんだ、よく分からないものだ。

 stringはなんでもあらわせるからstringにした。おそらくこの値は、なんでも表すことが可能で、変形することが可能で、同一かどうかを判別することが可能である必要があるだろう。だから最近の参照型の不変stringではちょっとまずい。パブリックセッターを持つ「stringをもったクラス」にしてやるといいだろう。だからその型はIEnumerable>こうだ。

 この万能型を引数にとり、万能型を処理結果として返すノードとはなにものであろうか。ノードはまず入力を調べるわけだが、万能型にどんな値があるかは確率的にしか分からない。ノードはある一つの処理をする。分かりやすいように「ソースコードを持っている」と考えよう。しかしそのソースコードはネットワーク指向プログラミング言語で書かれているので、ソースコード自身も万能型になる。万能型のソースを解析し、処理を行い、不完全な結果を見出しそれを自ノードから見えるネットワーク構造と照らし合わせて次に移動するノードを決める。あるいは入力を待つ。これがネットワーク指向プログラミング言語の全体像になる。この理論に基づいた処理系をつくり、何か意味のある計算が出来たら超すごいが、この言語を用いて意味のない計算をすることこそが知性の発生を見出す鍵となると考えている。