DSL / Mixing-in Another Language


DSL

他言語を混ぜあわせる

一言要約

DSLにて沢山のレアケースに対応するため拡張していくと複雑になるので、Foreign Codeを利用しようず。

要約

外部DSLで危険なのは、レアケースにたくさん対応していくと複雑になって汎用言語に近づいていってしまうことである。

製品の種類や顧客が拠点とする州に応じてセールスマンを配置するDSLを考えてみる。

scott handles floor_wax in WA;
helen handles floor_wax desert_topping in AZ NM;
brian handles desert_topping in WA OR ID MT;
otherwise scott

スコットがベーカー企業の重役と親しくなったら、ベーカー◯◯という会社は全てスコットに割り当てるようにしたい。

このようなケースに対応してDSLを拡張していくと複雑になるので、DSLに汎用言語を埋め込むForeign Codeを利用することで解決できる。

scott handles floor_wax in MA RI CT when {/^Baker/.test(lead.name)};

上記例のようにForeign Codeには動的言語を使うのが便利で、静的言語だとコード生成や生成したコードにホストコードを入れ込ませたりしなければならない。

Foreign Codeに汎用言語でなく別のDSLを使うこともできるが、パーサ技術やツールが成熟していない現状はオススメしない。

Foreign Codeを使う上で問題なのは埋め込まれたコードをどうトークナイズするかで、Alternative Tokenizationアプローチを使う必要がある。最もシンプルなのは何らかのデリミタで埋め込みコードを囲むこと。

Alternative TokenizationはForeign Codeのためだけでなく、名前の一部をキーワードとして扱わないようにするためにも使われる。

item camera;
item small power plant;
item acid bath;
item small white item;   <--
  • lexerの中には字句状態(lexical states)を持って、それぞれの状態で異なるトークナイズルールが動作できるものがある
  • ツールの中にはストリーム上でトークンの種類が変化した時、構文解析エンジンが参照する前にトークンの種類を変更できるものがある
  • 単にそのトークンを無視することも可能

ファウラーへのフィードバック

  • Topicを見てやっと「あー」と分かることが多く、このNarrativeを読むだけだと理解しづらい。Alternative Tokenizationとか。

担当者のつぶやき

  • 元ページが生成処理でエラっててサンプルコードが見えない! Foreign Codeを見て想像するしかない。

みんなの突っ込み