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; <--