2010-10-05 16 views
12

Ho esaminato un paio di libri e risorse su linguaggi specifici di dominio. Penso di voler creare un DSL interno in Scala.Come creare un DSL interno in Scala?

def instrument = new FXInstrument { 

    provider = "EuroBase" 
    instrumentOrders = List(
     new FXOrder { 
      baseCcy = "GBP" 
      termCcy = "EUR" 
      legs = List( 
       new FXLeg { 
        amountPrice = 100000.0 
        spotPrice = 1.56 
        requirements = List(
         new FXRequirement { 
          baseCcy="GBP" termCcy="EUR" 
          settlement="Banker Rain" 
         } 
        ) 
       }, 
       new FXLeg { 
        amountPrice = 200000.0 
        spotPrice = 1.50 
        requirements = List(
         new FXRequirement { 
          baseCcy="GBP" termCcy="EUR" 
          settlement="Banker Sunny" 
         } 
        ) 
       } 
      ) 

     }     
} 

Tale che segue afferma valgono:

instrument.orders(0).baseCcy should equal ("GBP") 
instrument.orders(0).termCcy should equal ("EUR") 
instrument.orders(0).legs(0).amountPrice should equal 100000.0 
instrument.orders(0).legs(0).spotPrice should equal 1.56 
instrument.orders(0).legs(1).amountPrice should equal 200000.0 
instrument.orders(0).legs(1).spotPrice should equal 1.50 
instrument.orders(0).legs(0).requirements(0).settlement should equal "Banker Rain" 
instrument.orders(0).legs(1).requirements(0).settlement should equal "Banker Sunny" 

Io proprio non so bene come implementare il linguaggio specifico dominio come una rappresentazione interna

1) nuova FXOrder() {/ chiusura /}

Mi piace questa sintassi, è buona o dovrei preferire oggetti complementari. Ad esempio, posso introdurre rapidamente altri tipi di FX facilmente.

2) Voglio usare "pari" come FXOrder è un Mixy scala.Proxy, quindi utilizza il tratto Proxy (mixin)

Per esempio `` instrument.peer '' dà la Java Object pari interno delle API di proprietà di terzi (di servizi finanziari ben noto sistema di negoziazione, si può indovinare?)

Idem per

instrument.orders (0) .peer instrument.orders (0) .legs (0) .peer instrument.orders (0) .legs (0) .requirements (0) .peer

e così via.

Mi rendo conto che il linguaggio specifico del dominio non è così semplice come pensavo, tuttavia alcuni suggerimenti su quanto sopra, sarebbero davvero utili. Apprezzerei le tue risposte. Ta!

PP

+1

Puoi dare un'occhiata a http://programming-scala.labs.oreilly.com/ch11.html#InternalDSLs –

risposta

6

Forse, questo può aiutare: DSL in Scala

+0

Questo link è rotto. :( – Kao

+0

https://www.amazon.com/Programming-Scala-Scalability-Functional-Objects/dp/0596155956%3FSubscriptionId%3DAKIAILSHYYTFIVPWUY6Q%26tag%3Dduckduckgo-d-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953 % 26creativeASIN% 3D0596155956 – adrian

5

non ho considerato ciò che si vuole ancora, ma ho visto un problema:

1) nuova FXOrder () {/ closure /}

No, non funziona in questo modo. Quando si segue un'inizializzazione (new Something) con un blocco, si esegue la sottoclasse anonima. Quello che stai facendo in realtà è new FXOrder() { /constructor, methods, getters and setters/ }.

Problemi correlati