内部 Dsl スタイル

2006年10月24日

内部DSL(埋め込みDSLと呼ばれることも多い)は、既存のホスト言語内に記述されるDomainSpecificLanguageです。これは、いくつかのプログラミング言語コミュニティ、特にLispコミュニティで一般的な考え方です。急速に成長しているRubyコミュニティではDSLが一般的な考え方であるため、現在大きな注目を集めています。

人々が内部DSLについて語るとき、私は2つのスタイルが見られる。内部ミニ言語と言語拡張です。

内部ミニ言語は、外部DSLと同じことをするために内部DSLを使用しています。あなたは意識的にプログラムのミニ言語セクションに完全なGPLのサブセットを使用することを決定します。これは(私の言語ワークベンチ論文からの例)のようなものに見えるかもしれません。

mapping('SVCL', ServiceCall) do
  extract 4..18, 'customer_name'
  extract 19..23, 'customer_ID'
  extract 24..27, 'call_type_code'
  extract 28..35, 'date_of_call_string'
end
mapping('USGE', Usage) do
  extract 9..22, 'customer_name'
  extract 4..8, 'customer_ID'
  extract 30..30, 'cycle'
  extract 31..36, 'read_date'
end

これはすべて有効なRubyですが、Rubyのサブセットを使用すると、カスタムDSLのようにも見えます。

外部DSLとは異なり、ホスト言語の構文とプログラミングモデルによって制限されますが、パーサーを構築する必要はありません。また、必要に応じて複雑なケースでホスト言語の機能を使用することもできます。

内部DSLを使用するための別の方法は、外部DSLで行う可能性のあることとはかなり異なります。これは、DSLの手法を使用してホスト言語を拡張する場合です。これの良い例は、Ruby on Railsの多くの機能です。Railsの検証のこれらのビットを見てください。

validates_numericality_of :age
validates_uniqueness_of :ssn
validates_format_of :length, :with => /^\d+(in|cm)/

これらのRailsの検証のビットを読むと、Ruby言語に新しいキーワードを与えたようにも見えます。もちろん、Rubyは変更していません。これはすべて賢いメタプログラミングです。しかし、Ruby言語を拡張したような気がします。

これらはどちらも非常に便利なテクニックです。他の分類と同様に、それらの間には不鮮明な境界線があります(Rakeはどちらの方法でも考えられます)。