Scala DSL - Übergeordnetes Element mit verschachtelter Blockreferenz

In Scala mit DSL herumspielen, also sagen wir mal, ich habe so etwas:

house {
  floor {
    bedroom("kids)
    bedroom("master")
  }
  floor {
    kitchen()
  }
}

Was ich jetzt möchte, ist, dass jeder verschachtelte Block eine Referenz hat oder auf Funktionen im umschließenden Block verweist. Der Effekt ist beispielsweise, dass der Boden zum Haus, das Schlafzimmer zum Boden usw. hinzugefügt wird.

Momentan mache ich das auf schreckliche Weise, indem ich einen globalen Stapel habe, der auf jeder verschachtelten Ebene aktualisiert wird, um den aktuellen "Kontext" zu verfolgen. Auch meine aktuelle Version ist nicht typsicher, da ich einem Haus ein Schlafzimmer hinzufügen kann.

Eine weitere frühere Revision war

house {
  floor {
    bedroom("kids) +
      bedroom("master")
  } +
    floor {
      kitchen()
    }
}

Wo jeder Block eine Liste von Widgets zurückgab (das + verwandelte ein generisches "Ding" implizit in eine "Dingliste", damit das nächste "Ding" hinzugefügt werden kann). Die zurückgegebene Liste der Widgets wurde dann hinzugefügt, sobald der Block zurückgegeben wurde. Aber ich mag die erzwungene Verwendung von + nicht, da es auf vielen Seiten hässlich wird.

Wie auch immer, um die beiden zu verschmelzen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage