DSLを使った簡単な例

ScalaにおけるDSL(Domain-Specific Language)は、特定の用途やドメインに特化した構文や記法をScalaの文法上で自然に表現できるようにしたものです。Scalaは関数型とオブジェクト指向の特性を併せ持ち、中置記法、括弧省略、暗黙の変換などの機能が豊富なため、**内部DSL(Embedded DSL)**を作成するのに非常に適しています。


DSLを使った簡単な例:電卓DSL

ここでは、加算・減算・乗算・除算を自然な構文で表現できる簡単な電卓DSLを実装してみます。

1. DSLの目的

通常のScalaコードでは以下のように計算します:

scala
val result = (2 + 3) * 4

これを例えば以下のような構文にしたいとします:

scala
val result = 2 add 3 multiply 4

このような構文をDSLとして定義することが可能です。


2. 実装例

scala
class RichInt(val value: Int) { def add(x: Int): RichInt = new RichInt(value + x) def subtract(x: Int): RichInt = new RichInt(value - x) def multiply(x: Int): RichInt = new RichInt(value * x) def divide(x: Int): RichInt = new RichInt(value / x) override def toString: String = value.toString } // 暗黙の型変換 implicit def intToRichInt(x: Int): RichInt = new RichInt(x) // 使用例 val result = 2 add 3 multiply 4 println(result) // 出力: 20

3. 解説

  • RichInt クラスは、整数に対してaddmultiplyといったメソッドを定義します。

  • implicit def により、Scalaの整数 Int を自動的に RichInt に変換します。

  • その結果、Scalaの構文で 中置記法(infix notation) が可能になり、まるで自然言語のような記述ができます。


4. DSL化の工夫ポイント

ScalaでDSLを構築する際は、以下のような工夫がよく使われます:

機能・構文 説明
中置記法 a add b のように演算子をメソッド呼び出しとして記述可能
括弧の省略 引数が1つの場合、括弧なしで呼び出せる (a add 3)
演算子の定義 :+, ::, --> など任意の記号を演算子として定義できる
暗黙の型変換(implicit) 元の型をDSL用のクラスに変換して拡張する

まとめ

ScalaのDSLは、通常のAPIよりも表現力豊かで、読み書きしやすいコードを提供します。簡単な電卓DSLでも、Scalaの型変換・中置記法・メソッド呼び出しの柔軟性を活かせば、直感的な構文を実現できます。より複雑なDSLは、Akkaのようなフレームワークや、SQLクエリビルダー、構成ファイル記述など多くの用途に応用されています。

生成日:2025/05/04