Vogliamo creare un DSL in Scala in cui è possibile elencare in modo dichiarativo gli ingredienti di cui un prodotto è composto. Questi ingredienti possono essere ad esempio "Crea prodotto a", "Crea prodotto b", "Invia mail". Gli ingredienti possono dipendere l'uno dall'altro (ad esempio, "mail" può essere inviato solo una volta che sia il prodotto a che il prodotto b sono stati creati). L'obiettivo è che la definizione degli ingredienti non includa informazioni imperative. Il parser del DSL deve determinare l'ordine di esecuzione corretto in base ai tipi di esempio.
Quindi ad esempio:
"CompletedProduct" consists of { Mail, ProductA, ProductB }
dovrebbe risultare in ProductA
e ProductB
che viene eseguito per primo (preferibilmente in sequenza, ma questo non è necessario in un primo passaggio), e una volta che questo è finito Mail
dovrebbe essere eseguito e una mail dovrebbe essere inviata.
Quali sono i modi possibili per eseguire tale DSL che ha determinato un piano di esecuzione?