型定義構文とDSL

きっかけは GDNJ のこの辺の投稿.

これらの質問には共通の認識があるように見えます.私はこれを以下のように解釈しました.すなわち,ある構造体なりクラスなりがあったときに,次のような性質を実現できないか,というものです.

  1. 将来的にフィールドに増減・修正が入るかもしれない
  2. いくつかのメソッドではフィールドを直接利用しているが,将来変更があった場合に毎回定型的な修正が必要になる.これは手間だ.
  3. 何とか「フィールドを変更してもメソッドの修正が必要にならない実装」は出来ないか?

確かに,クラスを作ったそのときから,嫌な予感,つまりいずれはフィールドセットを変更しなければならないだろうという予感があることは珍しくありません.そのような場合,フィールドセットが変化してもメソッドの修正が不要というのはそれなりにありがたい性質と言えます.
一方,これを積極的に利用し,フィールドセットによってプログラミングを行うということも可能でしょう.内部 DSL というわけです.

つまり、DSLをホスト言語に組み込み、ホスト言語のサブセットを抽象的な言語のカスタム構文として使っているのです。

例えばこちらの投稿で用いたのは,C# の型定義構文を内部 DSL として利用したものです.

実際,.NET での型定義構文と属性の組み合わせは,MSIDL や COM TypeLibrary に代わる第三の具象構文として利用されています.また,P/Invoke でのマーシャリングについても型と属性によって「プログラミング」が可能となっています.
とまあ,そういう見方もありますよ,というお話でした.