1 of 17

Domain-Specific Languages

Intro & Internos

2 of 17

DSLs

  • Lenguajes
    • Propósito General (GPL: General Purpose Languages)
    • Específicos de dominio (DSL)
  • GPLs
    • Permiten construir cualquier tipo de aplicaciones
    • Ej: C, Java, Smalltalk, Ruby, etc…
  • DSLs
    • Sólo permiten describir o programar un tipo específico de aplicaciones.
    • Ej: SQL, HTML, RegExp, Markdown, etc..

3 of 17

DSLs

  • Externos
    • “full”
    • Parser/Lexer/Linker etc “propio”
    • No requieren de otro lenguaje
    • Implementación
      • Interpretados
      • Compilados
      • Traducidos: generan código de otro lenguaje.
  • Internos
    • Sobre un GPL existente
    • Utilizando “truquitos”

4 of 17

Comparación

5 of 17

DSLs Internos

6 of 17

DSLs Internos

  • Evitan overhead de construir un lenguaje completo
  • (intenta) Ocultar detalles del GPL
    • Sintaxis: llaves, puntos, etc.
    • Conceptos del paradigma: ej, classes, métodos, variables.,etc
  • Sintax ~= conceptos del dominio
  • Dependen mucho del GPL que tengamos !!

7 of 17

DSLs Internos - Características útiles de GPLs

  • Puntos y paréntesis opcionales (ej: ruby, scala)

cuenta depositar 234 vs cuenta.depositar(234)

  • Extender clases (ruby open classes, xtend extension methods, scala implicits)

Xtend: hs(2) => 2.hs() => 2.hs

Scala: (implicit) 2.hs() => 2 hs

8 of 17

DSLs Internos - Características útiles de GPLs

  • Sobrecarga operadores (scala, ruby, xtend)

Ruby: taxi libre?

Scala/Xtend: api / usuarios / get

9 of 17

DSLs Internos - Características útiles de GPLs

  • bloques

Ruby:

una casa do

color :amarilla

de 3.ambientes

end

Xtend (operador with)

casa => [

color = amarilla

de( 3.ambientes )

]

10 of 17

DSL Internos - Herramientas utiles de los GPLs

Varargs y literales de lista

casa.con(

domitorio,

cocina,

baño

)

11 of 17

DLs Internos en Ruby

12 of 17

Ruby DSLs

Estructuras anidadas con bloques e instance_eval

casa do

dormitorio do

con :placard

end

cocina

end

13 of 17

Ruby DSLs

Keywords de negocio:

  • métodos de instancia
    • heredados con mixins
    • heredados por Open Classes
  • method_missing

class Descripcion

casa do .. end

end

“casa” puede ser un método con un bloque opcional

def casa(&bloque)

ó bien method missing también con bloque

def method_missing(name, args, &bloque)

14 of 17

Ejemplo HTML

15 of 17

Html - Bosquejo de lo que queremos

<html> <body><div id="container"><ul class="pretty"><li class="active">Item 1</li><li>Item 2</li></ul></div></body></html>

html = Html.new.document dobody dodiv id: "container" doul class: "pretty" doli "Item 1", class => :activeli "Item 2"endendendend

16 of 17

Ejemplo Agenda - Xtend

17 of 17

DSL - Agenda

Ejemplo de TP en xtend

val agenda = agenda(

14.h - "Inicia Objetos 3",

18.h - "Fin objetos3" => [

remindMe > "Escribir Bitacora".via.email

],

19.h - "Llegada a casa" => [

remindMe > "Enviar enunciado de TP" . via . sms

remindMe > "Lavarse Las Manos" . via . phoneCall

],

)