演算子空間と文法空間

k.inabaさんのPoemyの実装が公開されていました。
レイヤーという概念がなかなか面白い言語です。
そこで、レイヤーからインスパイアされて考えたことを以下に書きます。
結構まとまってないので納得がいかないなぁと思いつつ、数日たってしまったので、公開してしまいます。


新しいコンパイラ言語ではコンパクトな式をベースにDSLとしてインラインアセンブラを実装しようと考えています。
C式では優先順位付きの演算子をユーザーが定義できます。
DSL内の演算子の優先順位とホストとなる言語の演算子の優先順位は変えることが出来ればより表現力が上がります。

DSLの開始と終了をホスト言語上に綺麗に記述できることが求められます。そのための一般的なルールがあるとよいでしょう。

さて、われわれはすでにC言語風の言語からそのようなルールを見出すことが出来ます。以下に2つの例をあげましょう。

1つの例はC言語のインラインアセンブラです。
インラインアセンブラは asm { ... } の中にアセンブラを記述できます。

もうひとつの例はPerlです。Perl は qq{ ... } は文字列として扱えて、(クォートとクォート風の演算子)として様々な演算子が定義されています。
q{...}はクォート、qq{...}はダブルクォート、qw{...}は配列の意味という具合です。qq/ .... / でも qq| | デモよいといった具合ですね。 有名な正規表現もs{}{}であらわすことも可能です。m{}で正規表現にマッチできて、m//と書いたりできます。
この正規表現JavaScript似も取り込まれていて、m// と書くことができます。


この2つの例だけがすべてではありません。しかし新しい言語空間を作るのには何かしらのカッコあるいは、デリミタを用いるのがよさそうです。
何かしらのアルファベットで記述することにすることでより、一般的な名前空間の識別子として使うことが出来るでしょう。