問題
この質問の動機は、この質問の解決策を見つけようとすることです。
次の構文を使用して階層構造を構築するとします。
root {
subA {
subB("b1.1")
subB("b1.2")
}
}
subB
構築 DSL はタイプ セーフである必要があります。つまり、 aを に直接ネストroot
したり、 asubA
を別の にネストしたりできませんsubA
。したがって、私の考えは、 methodroot
を定義するオブジェクトを返すメソッドを用意subA
し、後者が を定義するオブジェクトを返すようにすることsubB
です。
私が今欲しいのは、に渡されるコードのブロックroot
、つまり、
subA {
subB("b1.1")
subB("b1.2")
}
の呼び出しがsubB
によって作成されたオブジェクトにバインドされるように、 が実行されroot
ます。基本的にはこのように
root { r: Root =>
r.subA { sa: SubA =>
sa.subB("b1.1")
sa.subB("b1.2")
}
}
ただし、レシーバーr
をsa
明示的にする必要はありません。
質問:this
Scala ではコード ブロック内でレシーバー、特に暗黙のレシーバーを再バインドできますか? おそらくマクロを使用しますか?
その他のアプローチ
この記事では、似たような XML ツリーの構築 DSL について説明します。それらの実装は機能に基づいてDynamic
おり、結果の DSL 構文は次のようになります。
xml html {
xml head {
xml title "Search Links"
}
}
ただし、このアプローチには明示的なレシーバー (ここでは object ) が必要であり、さらに深刻なことに、ノードをノード内にxml
ネストすることを静的に防止するという意味で、タイプセーフではないと思います。html
title