の提案

2chでいろいろな議論があるなか叩かれつつも考えが進んだので文章にしてみました。
日本語は苦手ですが、それなりにがんばったつもりです。


一般的な言語は文脈自由文法により定義されます。
文脈自由文法とは文章の流れによって構文が変わることがなく文脈に依存しない文法のことです。
文脈に依存しない、前後関係を気にしなくてよい文法は、すなわち文脈から自由であることから文脈自由文法と呼ばれます。
文脈自由文法に対して文脈によって文法が変わる文法のことを文脈依存文法といいます。
文脈自由文法を記述するにはバッカス・ノウア記法(BNF記法)が用いられます。
美しいと感じるかどうかは個人によって異なります。
しかし、文法が簡潔かどうかは一つの言語の美しさの尺度とすることが出来ます。

C言語の一族は現在もっとも人気のある言語の一族の1つです。
しかし、それぞれの言語の文法は似てはいますがそれぞれ異なります。
そのため統一的に扱うことは出来ません。

仮にC言語の一族を1つにまとめた枠組みを作ろうとすれば文脈自由文法を超えた枠組みが必要となります。
文脈自由文法の範囲を超えた文法は文脈依存文法です。
ですから、文脈に依存する枠組みがあればよさそうです。
言語の仕様が確定すれば文脈自由文法にしたほうが最適化がしやすくなる等恩恵があります。
しかし、言語の仕様が確定していない場合は文脈に依存した文法のほうがより適しているといえるでしょう。
プロトタイプ的な言語を作るには動的な性質を持っていたほうがより便利です。
関数型言語の多くは演算子を動的に定義することが可能です。
その性質のおかげで言語のプロトタイプ的な実験を比較的楽に行うことが出来ます。
しかしながら、私の知る限りにおいてC言語に似た記述を行うための枠組みは存在しません。
そこで、C言語に似た記述が出来る言語を作成し、その言語の上でさまざまな実験をする提案がC式という言語になります。

とはいえ、文法を分かりやすく記述する道具としてBNFは強力な言語です。
以下に拡張BNF記法によるC式の定義を示します。

2項演算子式 = C式 { 2項演算子 C式 }
前置演算子式 = 前置演算子 C式
後置演算子式 = C式 後置演算子
括弧演算子式 = '(' C式 ')'
括弧演算子式 = '{' C式 '}'
括弧演算子式 = '[' C式 ']'
後置括弧演算子式 = C式 '(' C式 ')'
後置括弧演算子式 = C式 '{' C式 '}'
後置括弧演算子式 = C式 '[' C式 ']'
演算子式 = キーワード '(' C式 ')' C式
演算子式 = キーワード '{' C式 '}' C式
演算子式 = キーワード '[' C式 ']' C式
空白演算子式 = C式 { C式 }
C式 = トークン | ε | 2項演算子式 | 前置演算子式 | 後置演算子
C式 = 括弧演算子式 | 後置括弧演算子式 | 文演算子式 | 空白演算子

この定義では結合順については記述していません。
2項演算子式は左再帰の結合と右再帰の結合がある2項演算子で結合される式で例えば1+2のような式になります。
if elseの elseも2項演算子とするとC言語のif else 文のようなことが可能になります。
前置演算子式は左再帰の結合で- 1 や ! 3 のように前に付く演算子です。
後置演算子は右再帰の結合で i++ i--というような式になります。;も後置演算子として定義することが出来ます。
括弧演算子式は括弧をつけた式です。()は通常優先順位を変更されるために使用しますが、それ以外の用途に使用しても構いません。
例えば(a,b){a+b}でクロージャとすると定義することが出来ます。
後置括弧演算子式はC言語の関数呼び出しや、配列などを表すのに使います。例えば a[3] sin(sita)等です。その考えを拡張して
fun{a=>b a+b}等と書くことも可能にします。後置括弧演算子である{}はRubyのブロックの記述やstruct等に使用できます。
演算子式は式の癖に文とか付いているわけの分からない名前ですが、要するにC言語の多くの構文を表すのに使用できます。
演算子はなくても表現が可能ですがギリギリすぎるのであったほうがよいかということで追加したものです。
javascriptでfunction(a,b)a+bと記述可能になったことを受けて記述できるようにしました。

以上の文法があればC言語の記述と同等の記述力を持つことが可能です。
これらを組み合わせて文法を組み立てれられていれば、C式バリッドな言語であるということが出来ます。
ベースとなる式の上に言語を組み立てられているかどうかは、より美しい言語である指標の1つと言えるでしょう。