Domain-Specific Languages
Intro & Internos
DSLs
DSLs
Comparación
DSLs Internos
DSLs Internos
DSLs Internos - Características útiles de GPLs
cuenta depositar 234 vs cuenta.depositar(234)
Xtend: hs(2) => 2.hs() => 2.hs
Scala: (implicit) 2.hs() => 2 hs
DSLs Internos - Características útiles de GPLs
Ruby: taxi libre?
Scala/Xtend: api / usuarios / get
DSLs Internos - Características útiles de GPLs
Ruby:
una casa do
color :amarilla
de 3.ambientes
end
Xtend (operador with)
casa => [
color = amarilla
de( 3.ambientes )
]
DSL Internos - Herramientas utiles de los GPLs
Varargs y literales de lista
casa.con(
domitorio,
cocina,
baño
)
DLs Internos en Ruby
Ruby DSLs
Estructuras anidadas con bloques e instance_eval
casa do
dormitorio do
con :placard
end
cocina
end
Ruby DSLs
Keywords de negocio:
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)
Ejemplo HTML
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 do� body do� div id: "container" do� ul class: "pretty" do� li "Item 1", class => :active� li "Item 2"� end� end� end�end
Ejemplo Agenda - Xtend
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
],
)