もしも、自分がシンタックス屋さんなのだとしたら

と、ふと風呂に入って考えた。
カラオケのシダックスじゃないよ。プログラミング言語の構文屋だったらと。
自分は、いろいろな面白そうな構文を考えてブログに書く。
それでいいんじゃないかと。
論文の体裁はないかもしれないけど、読んで新しい知識やアイディアがある。
それを読んだ人の誰かがそのアイディアを元によりそれらしいプログラミング言語を作るのだ。

それでいいんじゃないかなぁと思った。


ということで、C言語風式言語もいいけど、Ruby風式言語だったり、go言語風式言語だったりを考えて書いてみるのもいいかなと思います。


なぜ、ruby風かというとendで終わる系の式言語あってもいいよねということと。
なぜ、goかいうと、前置二項演算子について考えるのは面白いよなということで。
python風はもう、cyanもあるし、haskellもあるしpythonそのものも式言語なのでもういいでしょう。

ということで、ruby風式言語について考える。
とにかく、rubyは特定のキーワードがあると、endまでが終わりってことが多い。
ただ、すべてではなくて場合によって便利で書きやすいようになっている。
あるキーワードとendの対をend演算子と呼ぶことにする。
そしてその演算子の名前を<キーワード>end 演算子と呼ぶことにしよう。

たとえば、classをキーワードとしたend演算子として定義すると、
定義した演算子はclass end演算子と呼ぶことになる。

このclass end演算子はブロックとして働く。
ほかに、if end演算子や do end演算子 def end演算子なども存在するとする。

class
  def
    if
    end
    do
    end
  end
end

さて、これだけでは、rubyと同様の表現はできない。なぜならば、classには名前が必要だし、継承する構文も欲しいからだ。
defは関数名とパラメータをつけたい。
ifは1つの条件式と条件が成り立った場合に実行する式とelseの式を書けるようにしたい。

そこで、こんな感じで書けるように考える。

class B < A
  def add(a,b)
    if a
      aaa
    elseif b
      bbb
    else
      ccc
    end
    do
    end
  end
end

この式は以下のリストとして構文解析されることにする。

(class (< B A)
  (def add (a b)
    (if (else (a aaa)
              (elseif (b bbb) (ccc))))
    (do)))

elseはend演算子の式のセパレータとして働く。
とまぁ、そんなかんじで、永遠と考えて実装していくと、rubyに似て異なる言語が出来上がることでしょう。