web-dev-qa-db-ja.com

ScalaのDSLとは何ですか?

さまざまなScala関連資料を見ると、DSLという用語は多くの場所で使用されています。

グーグル検索はそれがドメイン固有言語であることを示しています。

それは正確にはどういう意味ですか、そしてなぜこの用語はJavaのような他の言語を学んでいるときに出くわさないのですか?

7
Mandroid

他の人が指摘しているように、質問の最初の部分(「DSLとは何ですか?」)は基本的に DSLとは何ですか?どこで使用すればよいですか?

代わりに、2番目の部分に答えようとします:なぜDSLはScalaでそれほど人気が​​あるのですか?

その理由は、Scala(Javaのような他の言語とは対照的に)はDSLを提供するための多くの構文機能を提供するからです。

たとえば、Scalaには中置メソッドアプリケーションがあります:

someObject.someMethod(someArgument)

// can be written as

someObject someMethod someArgument

これにより、カスタムの「演算子」を言語で非常に簡単に導入できます。注目すべき例は、アクターにメッセージを送信するための akka DSLです。

actor ! message

これはErlangの構文を模倣したDSLです。

Scalaの構文機能の別の例は、「末尾のブロック引数」です(正確な名前があるかどうかはわかりません)。

def someMethod(x: Int)(y: String) = ???

// can be invoked as
someMethod(42)("foo")

// but also as
someMethod(42) { "foo" }

これは、最後のパラメーターが関数の場合に非常に興味深いものです。

def someOtherMethod[A, B](x: A)(f: A => B): B = ???

someOtherMethod(42) { a =>
  // ...a very long body
}

他の言語では、ブロック({ ... })は通常、組み込みの制御フロー構造(ifwhileforなど)に予約されていますが、Scalaこの構文機能を使用して、組み込みの制御構造に似たカスタムメソッドを構築できます。

これらの2つの機能だけでも、DSLがScalaコミュニティで非常に普及している理由を説明するのに十分な特徴があります。

もう少し掘り下げて、既存の型にカスタムメソッドを追加できる暗黙の変換についても言及できます。例えば

implicit class TimesOps(x: Int) {
  def times(y: Int): Int = x * y
}

// then use as

2 times 4 // 8

この例では、中置メソッドアプリケーションと暗黙的な変換の使用を組み合わせています。

15