代数の定義を表すために、Scalaで内部DSLを構築しようとしています。この単純化されたデータモデルを考えてみましょう。
case class Var(name:String)
case class Eq(head:Var, body:Var*)
case class Definition(name:String, body:Eq*)
たとえば、簡単な定義は次のようになります。
val x = Var("x")
val y = Var("y")
val z = Var("z")
val eq1 = Eq(x, y, z)
val eq2 = Eq(y, x, z)
val defn = Definition("Dummy", eq1, eq2)
このような方程式を次の形式で表すための内部DSLが必要です。
Dummy {
x = y z
y = x z
}
私が得ることができる最も近いものは次のとおりです。
Definition("Dummy") := (
"x" -> ("y", "z")
"y" -> ("x", "z")
)
私が遭遇した最初の問題は、DefinitionとVarに対して2つの暗黙的な変換を行うことができないことDefinition("Dummy")
です。ただし、主な問題はリストです。()などのように囲んだり、要素をコンマで区切ったりしたくありません。
Scalaを使用して私が望むことは可能ですか?はいの場合、誰かが私にそれを達成する簡単な方法を教えてもらえますか?