Un requisito previo para la escritura de una conexión DSL es la comprensión de algunas técnicas de programación avanzadas como bloques rendimiento , El método de búsqueda de métodos de Ruby y method_missing(), etc. Leer Metaprogramming Ruby es la mejor manera de desarrollar estas habilidades avanzadas de Ruby (el libro también contiene una sección sobre cómo escribir DSL internas).
Escribí blog post on how to create a Ruby DSL to generate HTML markup en aproximadamente 20 líneas de código. Es mucho mejor comenzar con algunos ejemplos de juguetes pequeños que pasar directamente a una aplicación de nivel de producción como Erector. Estudiar el código fuente del Docile gem como lo sugiere ms-tg es excelente, pero aún así puede ser un poco abrumador como su primer DSL. Aprende algunas técnicas avanzadas de programación de Ruby, construye algunos ejemplos de juguetes y luego estudia el código fuente de Docile.
Aquí es cómo conseguir algunas de las funcionalidades de la gema dócil como se explica por @ ms-tg desde cero:
def dsl(obj, &block)
obj.instance_eval(&block)
end
Pizza = Struct.new(:cheese, :pepperoni, :bacon, :sauce)
obj = Pizza.new
dsl(obj) do |pizza|
pizza.cheese = true
pizza.pepperoni = true
pizza.sauce = :extra
end
p obj
# => #<struct Pizza cheese=true, pepperoni=true, bacon=nil, sauce=:extra>
El método dsl()
también se puede utilizar para ejemplos más triviales, como el ejemplo Docile README de la construcción de una matriz:
arr = []
dsl(arr) do
push(1)
push(2)
pop
push(3)
end
p arr
-1 porque, aunque dócil es ciertamente muy agradable, usarlo * * no pasa por el proceso de escribir una normal de Rubí DSL en lugar de explicar cómo se hace. – 00dani
@ 00Davo mientras tiene derecho a su opinión, es un gesto muy antipático. Especialmente teniendo en cuenta que el código fuente de Docile es una excelente manera de aprender a crear un DSL en ruby. –
Hmm. Eché un vistazo a la fuente, y tienes razón; de hecho es bastante ilustrativo. Cambiaré mi voto, pero también le recomiendo que edite la respuesta para incluir una referencia a la fuente de Docile. (Oh, acabo de intentarlo y, al parecer, mi voto está bloqueado a menos que la respuesta esté editada, por lo que en realidad * necesitarás * editar, ¿no es así?) – 00dani