[解決済み] ScalaのDSLって何?[クローズド]
質問
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メソッドの適用と暗黙の変換の使用を組み合わせています。
関連
-
[解決済み] Scalaで定数メンバを定義するには?
-
[解決済み] 理解する `andThen`
-
[解決済み] scala.Float to java.Float k/v変換でScala MapをJava Mapに変換するにはどうしたらいいですか?
-
[解決済み] Scalaのリターン
-
[解決済み] Scalaのオブジェクトとクラスの違い
-
[解決済み】タスクがシリアライズされない:オブジェクトではなくクラスに対してのみクロージャの外で関数を呼び出すとjava.io.NotSerializableExceptionが発生する
-
[解決済み】Scalaでケースクラスのインスタンスをクローンして、1つのフィールドだけを変更するにはどうすればよいですか?
-
[解決済み】Scalaのコンテキストとビューバウンドとは何ですか?
-
[解決済み] sbtのScalaTest:タグなしで単一のテストを実行する方法はありますか?
-
[解決済み] Build.scala、%および%%の記号の意味
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】scalacコンパイルで "object apache is not a member of package org "と表示される。
-
[解決済み】Spark - アプリの投稿時に「設定にマスターURLが設定されている必要があります」というエラーが発生する
-
[解決済み] ScalaのSeqへのアペンド
-
[解決済み] AWSのためのScala SDKまたはインターフェースはありますか?
-
[解決済み] 実行時に変数の型を取得したい
-
[解決済み] Scala 無名クラスでextendsを使用する方法
-
[解決済み] Scalaの''って何?
-
[解決済み】Scalaのvarとvalの定義の違いは何ですか?
-
[解決済み】Scalaの名前による呼び出しと値による呼び出し、明確化の必要性
-
[解決済み] 縮小、折りたたみ、スキャン(左/右)?