1. ホーム
  2. scala

[解決済み] ScalaのDSLって何?[クローズド]

2022-02-24 16:08:17

質問

Scala関連の様々な資料に目を通すと、DSLという用語は多くの場所で使われています。

Googleで検索すると、Domain specific languageと出てきます。

また、Javaなど他の言語を学習しているときに、この言葉が出てこないのはなぜでしょうか?

どのように解決するのか?

他の人が指摘しているように、質問の最初の部分("DSLとは何ですか")には、基本的に次のような答えが返ってきます。 DSLとは何か、どこで使うべきか?

なぜScalaではDSLがそんなに人気があるのでしょうか?

その理由は、Scalaが(Javaなどの他の言語とは対照的に)DSLを提供するための多くの構文的な設備を備えているからです。

例えば、Scalaにはinfixメソッドというアプリケーションがあります。

someObject.someMethod(someArgument)

// can be written as

someObject someMethod someArgument

このため、この言語では、カスタムの演算子("operator")の導入が非常に容易になっています。注目すべき例としては アッカ アクターにメッセージを送るためのDSLです。

actor ! message

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

Scalaの構文機能のもう一つの例は、"trailing block argument"です(正確な名前は不明)。

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
}

他の言語では、ブロック ( { ... } など)は、通常、組み込みのコントロールフロー構造(例えば if , while , for など)がありますが、Scalaではこの構文機能を利用して、組み込みの制御構造に似たカスタムメソッドを構築することができます。

この2つの特徴だけでも、ScalaのコミュニティでDSLが浸透している理由を説明するのに十分なほどです。

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

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

// then use as

2 times 4 // 8

この例では、infixメソッドの適用と暗黙の変換の使用を組み合わせています。