2010-10-05 7 views
12

He estado buscando un par de libros y recursos en idiomas específicos del dominio. Creo que quiero construir una DSL interna en Scala.Cómo crear un DSL interno en 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" 
         } 
        ) 
       } 
      ) 

     }     
} 

De tal manera que después afirma son válidos:

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" 

Sólo que no sé muy bien cómo poner en práctica el lenguaje específico de dominio como una representación interna

1) nueva FXOrder() {/ cierre /}

Me gusta esta sintaxis, es bueno o debería preferir los objetos de compañía. Por ejemplo, puedo introducir rápidamente otros tipos de FX fácilmente.

2) Quiero usar "pares" tal FXOrder es una mixi scala.Proxy, por lo que utiliza el rasgo Proxy (mixin)

Por ejemplo `` instrument.peer '' da la Java Object pares interno de la API propietario tercero (un conocido sistema de comercio de servicios financieros, se puede adivinar?)

lo mismo ocurre con

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

y así sucesivamente.

Me doy cuenta de que el lenguaje específico del dominio no es tan simple como pensaba, sin embargo, algunos consejos sobre este tema serían realmente útiles. Agradecería tus respuestas. ¡Ejército de reserva!

PP

+1

Puedes echar un vistazo a http://programming-scala.labs.oreilly.com/ch11.html#InternalDSLs –

Respuesta

6

Tal vez, esto puede ayudarle a: DSL in Scala

+0

Este enlace se ha roto. :( – 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

No he considerado lo que todavía quiere, pero vi un problema:

1) nueva FXOrder () {/ closure /}

No, no funciona de esa manera. Cuando sigue una inicialización (new Something) con un bloque, está haciendo subclases anónimos. Lo que en realidad está haciendo es new FXOrder() { /constructor, methods, getters and setters/ }.

Cuestiones relacionadas