オブジェクト指向で式を表す式のS式のドット対に対応する物

昨日は、LL Futureだったようですが、いろいろあって行きませんでした。
自分にとって最も重要なのはモチベーションで、ああいうイベントは
上がるか下がるか分からない不確定要素が強いので、とりあえず、やめた
っていうかんじです。もうちょっと自分の考えている言語が完成したら
いってみてもいいかなぁと思います。


てことで、まず、LISPのS式に対応するC言語風の式言語、C式というものがあったら、どういうものになるだろう?とずっと数年考えているわけですが、いまだ解決していない問題がいろいろとあります。今日はその中の1つの問題についてオブジェクト指向で式を考えた場合どうなるのかを考えてみました。


LISPのデータ構造は数値や文字列、識別子と、CONSセルと呼ぶ2つのオブジェクトが入るだけの入れ物があります。そのCONSセルにaとbが入っているとすると、(a . b)と書くことが出来て、ドット対と呼びます。LISPではこのCONSセルによって、オブジェクトを繋ぐことで、いろいろな構造を表すことが出来ます。右側に()あるいはリストがあるものをリストと呼びます。
(a . ())は右側に()があるのでリストと呼び(a)と書きます。
(a . (b . (c .())))は (a . (b . (c))) -> (a . (b c)) -> (a b c)と書くことが出来ます。逆にいえばどんなS式もドット対で書き表すことが可能です。しかし、出力は極力ドット対がない状態で出力されます。


このようなことを演算子で繋がるC式でも実現できないでしょうか?
(Expression Expressionなので実はC式と呼ぶよりもE式とあるいはX式と読んだほうがイイのかもしれないなと唐突に思いついた。ってのはおいておいて)
今日はオブジェクト指向言語である場合に式とはいったい何かを考えることでその基本となる構造を考えていきます。
1+2*3という式があったとします。これはオブジェクト指向で考えると、
1のオブジェクトの+演算子に対応するメソッドを取り出しパラメータ(2のオブジェクトから*演算子に対応するメソッドを取り出しパラメータ3で評価する式)で評価する式ということになると思います。<長い


例えば、+はopaddというメソッド*はopmulというメソッドであるとすれば、

1.opadd(2.opmul(3))あるいは1[opadd](2[opmul](3))と書けます。


1.あるオブジェクトから値を取り出す。
2.オブジェクトにパラメータを渡して評価する。


という2つの構造で表せそうです。

abstruct class Atom {}
class Int extends Atom {
  int data;
}
class Str extends Atom {
  String data;
}
class Symbol extends Str {}
class GetMember extends Atom {
  Atom object;
  Atom member;
}
class CallMethod extends Atom {
  Atom object;
  Atom param;
}

整数と文字列、識別子を扱うことができる式の内部構造。


javaで書けば、このような構造があれば、全ての式を表せそうです。そして、ドット対に該当するものは、a.bというメンバ取り出しとa(b)という関数呼び出しの形の2つであるということができます。


昔、id:amachangjavascriptの式は演算子と()演算子のシンタックスシュガーだというようなことを言っていましたがまさにそれです。


a.bはjavascriptでは、a["b"]と書くことも可能です。a["a b"]のように空白が入ったものはa.bの形式では表せないのでより一般的です。したがって、演算子と()演算子がドット対に対応するものと考えたらよいようにも思えますが、それはjavascriptの話です。a."hoge"と a.hogeという2つの式が存在してもわるいことではないので。


とりあえず、どちらがよいのかについては、おいて置いておきます。