ある程度型を曖昧にすべきか。煩雑化してでも型に厳格にすべきか。GADTsとかよくわかってない系おじさんですが、何か。Datatypes)が欲しくなるようです。これ、抽象構文木なんかを型付きで表したいときに発生する事案です。F#にはHaskellのGADTsに相当するものはありません。GADT相当の表現自体はOOPスタイルで書けば可能ではありますが、判別共用体で内部DSLを表現したいというコンセプトとはズレてしまうので今回は適用できません。仕方がないので、型を細分化してどんどん型が絞られていくような型を定義します。BulletMLのDTD定義に沿って、以下のような感じの型を定義すれば、判別共用体による内部DSLの構造(モロ抽象構文木)が表現できます。ここで定義したBulletml判別共用体は、確かに型付きDSLではあるのですが、BulletMLの仕様に準拠するかたちで型を表現するようにしたのでタイプセーフではないですね。タイプセーフではありませんが、まあそれなりです。今後、より型安全な判別共用体の提供とモナディックな弾幕構築の提供とか、弾幕コンピュテーション式...とかとか妄想しています。あとは、この型を弾幕として解釈することができる処理系を実装すればおkです(それが面倒くさい)。22というか、俺たちのF#にも牙突ください(!)外部DSLと内部DSLを両立する内部DSLであるBulletml判別共用体の構造は再帰的な構造になっていなく複雑です。上図のような構成では外部DSLを解析するためのパーサの実装コストが大きくなってしまいます。そこで、より抽象度の高い中間的なASTを用意し、下図のような構成にすることでパーサの実装コストを軽減することを考えます。中間ASTとは、つまるところXmlNodeの構造そのものなので、以下のように単純な木構造の判別共用体で表現することができる。string外部DSLを解析するパーサは、より抽象的で単純な構造にパースするだけでよくなるので、とてもシンプルな実装で済むようになります。実際のパーサの実装例を見てみましょう。SXML形式のパーサかの竹内郁雄氏は、「XMLもぶ厚いカッコのあるLisp」とおっしゃっています。InfosetのS式による具象表現であるところのSXMLがそれを体現していますね。SXMLの基本的な構成要素はこんな感じです。