32 votes

Tutoriels pour écrire DSL en Ruby

Quels sont les bons didacticiels en ligne sur la façon d'implémenter des DSL dans Ruby? Je recherche des exemples pratiques qui expliquent l'ensemble du processus.

Je suis conscient qu'il y a cette question sur les bons livres sur les DSL et Ruby: de bons livres sur les DSL basés sur Ruby .

35voto

Dave Paroulek Points 6033

Je pense que c'est une grande série d'articles sur la construction d'un DSL en rubis:

http://jroller.com/rolsen/entry/building_a_dsl_in_ruby

34voto

ms-tg Points 1087

Vous pouvez faire cela très facile avec le Docile gem, soit par l'utilisation de la gemme, ou en lisant le code source afin de comprendre comment il fonctionne.

Imaginons que vous vouliez faire une Pizza via une connexion DSL

Pizza = Struct.new(:cheese, :pepperoni, :bacon, :sauce)

Et vous utilisez un générateur de motif pour faire la Pizza

class PizzaBuilder
  def cheese(v=true); @cheese = v; end
  def pepperoni(v=true); @pepperoni = v; end
  def bacon(v=true); @bacon = v; end
  def sauce(v=nil); @sauce = v; end
  def build
    Pizza.new(!!@cheese, !!@pepperoni, !!@bacon, @sauce)
  end
end

Et vous voulez un DSL, dire quelque chose comme

@sauce = :extra
pizza do
  bacon
  cheese
  sauce @sauce
end
# => should return Pizza.new(true, false, true, :extra)

Tout ce que vous avez à faire est de définir la pizza de la méthode d'

require 'docile'

def pizza(&block)
  Docile.dsl_eval(PizzaBuilder.new, &block).build
end

Et d'un coup, vous avez terminé.

4voto

Alex Popov Points 1209

Je trouve ce tutoriel très bon, car il couvre explicitement les deux modèles très importants d'utilisation de yield et instance_eval :

Comment créer des DSL avec yield et instance_eval?

1voto

Powers Points 1742

Une condition préalable à la rédaction d'un DSL est la compréhension de certaines techniques de programmation avancées comme produisant des blocs, Ruby méthode du processus de recherche et method_missing(), etc. La lecture de la Métaprogrammation Ruby est la meilleure façon de développer ces avancées Ruby compétences (le livre contient également une section sur l'écriture interne DSLs).

J'ai écrit un billet de blog sur comment créer un Rubis DSL pour générer des balises HTML dans environ 20 lignes de code. C'est beaucoup mieux de commencer avec quelques petits jouets exemples, que de sauter à droite dans une production de qualité comme Monteur. En étudiant le code source de la Docile gem comme suggéré par ms-tg est excellente, mais il pourrait quand même être un peu écrasante, comme votre première DSL. Apprendre quelques avancées de programmation Ruby techniques, de construire des jouets exemples, et l'étude de la Docile code source.

Voici comment obtenir une partie de la fonctionnalité de l'Docile gem, comme expliqué par @ms-tg à partir de zéro:

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>

L' dsl() méthode peut également être utilisée pour les plus triviales exemples, comme le Docile README exemple de construction d'un tableau:

arr = []

dsl(arr) do
  push(1)
  push(2)
  pop
  push(3)
end

p arr

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X