SlideShare una empresa de Scribd logo
1 de 73
Descargar para leer sin conexión
(en Ruby)
Metaprogramación
 Programas que escriben programas


              Sergio Gil
Sólo para vagos
“Para qué voy a
hacer [tarea X] si
puedo escribir un
programa que lo
  haga por mí”
           Cualquier programador,
            en cualquier momento,
           ante cualquier situación
Programar no es
 una excepción
Automatización
Acercar el lenguaje al problema
    (para resolverlo mejor)
Qué es la metaprogramación
y de dónde ha salido semejante cosa
puts quot;puts 'hola'quot;




$ ruby -e quot;`ruby hola.rb`quot;
Programas que escriben otros programas




  Programas que modifican su propio
          comportamiento
       (es decir, se escriben a sí mismos)
“In Lisp, you don’t just write your
program down toward the language,
   you also build the language up
       toward your program.”
                         Paul Graham
Tipos de metaprogramación
Estática / Interna
Dinámica / Interna
Metaprogramación en Rails
Metaprogramación en Rails


• Generadores
Metaprogramación en Rails


• Generadores
• Métodos mágicos
Metaprogramación en Rails


• Generadores
• Métodos mágicos
 • method_missing
Metaprogramación en Rails


• Generadores
• Métodos mágicos
 • method_missing
 • const_missing
Metaprogramación en Rails


• Generadores
• Métodos mágicos
 • method_missing
 • const_missing
 • Definiciones dinámicas
Metaprogramación en Rails


     • Generadores
     • Métodos mágicos
      • method_missing
      • const_missing
      • Definiciones dinámicas
$ grep -r method_missing vendor/rails/ | wc -l
72
Metaprogramación en Rails


     • Generadores
     • Métodos mágicos
      • method_missing
      • const_missing
      • Definiciones dinámicas
$ grep -r method_missingvendor/rails/ ||wc -l
          const_missing vendor/rails/    wc -l
41
72
Metaprogramación en Rails


     • Generadores
     • Métodos mágicos
      • method_missing
      • const_missing
      • Definiciones dinámicas
$ grep -r method_missingvendor/rails/ ||wc -l
          define_method
          const_missing vendor/rails/    wc -l
67
41
72
Técnicas en Ruby/Rails
Generadores
Generadores



class ModelGenerator < Rails::Generator::NamedBase
  def manifest
    record do |m|
      m.directory File.join('app/models', class_path)
      m.directory File.join('test/unit', class_path)
      m.directory File.join('test/fixtures', class_path)
      m.template 'model.rb',           File.join('app/models', class_path, quot;#{file_name}.rbquot;)
      m.template 'unit_test.rb', File.join('test/unit', class_path, quot;#{file_name}_test.rbquot;)
      m.template 'fixtures.yml', File.join('test/fixtures', quot;#{table_name}.ymlquot;)
      m.migration_template 'migration.rb', 'db/migrate', :assigns => {
        :migration_name => quot;Create#{class_name.pluralize.gsub(/::/, '')}quot;
      }, :migration_file_name => quot;create_#{file_path.gsub(///, '_').pluralize}quot;
    end
  end
end
method_missing
method_missing

class Array
  def method_missing(meth, *args, &blk)
    if meth.to_s =~ /^map_(.+)$/
      map {|i| i.send($1)}
    else
      super
    end
  end
end
(1..5).to_a.map_to_s
method_missing

class Array
  def method_missing(meth, *args, &blk)
    if meth.to_s =~ /^map_(.+)$/
      map {|i| i.send($1)}
    else
      super
    end
  end
end
(1..5).to_a.map_to_s

>> [quot;1quot;, quot;2quot;, quot;3quot;, quot;4quot;, quot;5quot;]
const_missing
const_missing


class Module
  alias :normal_const_missing :const_missing

  def const_missing(cname)
    return normal_const_missing(cname) rescue nil
    unless table_name = SchemaLookup.models[cname]
      raise NameError.new(quot;uninitialized constant #{cname}quot;)
    end
    klass = Class.new(ActiveRecord::Base)
    const_set cname, klass
    klass.set_table_name table_name
    klass
  end
end
alias
alias

class String
  alias :largo :length
end

puts quot;holaquot;.largo
puts quot;holaquot;.length
alias

class String
  alias :largo :length
end

puts quot;holaquot;.largo                4
puts quot;holaquot;.length               4
alias

class String
  alias :largo :length
end

puts quot;holaquot;.largo                     4
puts quot;holaquot;.length                    4



class String
  alias :old_length :length
  def length
    old_length + 2
  end
end

puts quot;holaquot;.length
alias

class String
  alias :largo :length
end

puts quot;holaquot;.largo                     4
puts quot;holaquot;.length                    4



class String
  alias :old_length :length
  def length
    old_length + 2
  end
end

puts quot;holaquot;.length                    6
alias_method_chain
(el estándar de Rails para añadir funcionalidad a un método preexistente)
alias_method_chain
(el estándar de Rails para añadir funcionalidad a un método preexistente)



class String
  def length_with_message
    puts quot;Calculando longitud de #{self}quot;
    length_without_message
  end
  alias_method_chain :length, :message
end
puts quot;holaquot;.length
alias_method_chain
(el estándar de Rails para añadir funcionalidad a un método preexistente)



class String
  def length_with_message
    puts quot;Calculando longitud de #{self}quot;
    length_without_message
  end
  alias_method_chain :length, :message
end
puts quot;holaquot;.length




                                     Calculando longitud de hola
                                     4
send y define_method
la metaprogramación pata negra
send
send


str = quot;Metaprogramacionguequot;

puts str.upcase
puts str.send(:upcase)
send


str = quot;Metaprogramacionguequot;

puts str.upcase                      METAPROGRAMACIONGUE
puts str.send(:upcase)               METAPROGRAMACIONGUE
send


str = quot;Metaprogramacionguequot;

puts str.upcase                                METAPROGRAMACIONGUE
puts str.send(:upcase)                         METAPROGRAMACIONGUE




[ :upcase, :downcase, :reverse ].each do |m|
  puts str.send(m)
end
send


str = quot;Metaprogramacionguequot;

puts str.upcase                                METAPROGRAMACIONGUE
puts str.send(:upcase)                         METAPROGRAMACIONGUE




[ :upcase, :downcase, :reverse ].each do |m|   METAPROGRAMACIONGUE
  puts str.send(m)                             metaprogramaciongue
end                                            eugnoicamargorpateM
define_method y def
define_method y def


class Prueba
  def foo
    quot;fooquot;
  end
  define_method(:bar) do
    quot;barquot;
  end
end

p = Prueba.new
puts p.foo
puts p.bar
define_method y def


class Prueba
  def foo
    quot;fooquot;
  end
  define_method(:bar) do
    quot;barquot;
  end
end

p = Prueba.new
puts p.foo                 foo
puts p.bar                 bar
¿¿Y entonces??
¿¿Y entonces??


class Prueba
  [ :foo, :bar, :jander, :klander ].each do |m|
    define_method(m) do
      m.to_s
    end
  end
end

p = Prueba.new
puts p.foo
puts p.bar
puts p.jander
puts p.klander
¿¿Y entonces??


class Prueba
  [ :foo, :bar, :jander, :klander ].each do |m|
    define_method(m) do
      m.to_s
    end
  end
end

p = Prueba.new
                                        foo
puts p.foo
                                        bar
puts p.bar
                                        jander
puts p.jander
                                        klander
puts p.klander
Versión para realmente vagos


M = [ :foo, :bar, :jander, :klander ]

class Prueba
  M.each do |m|
    define_method(m) do
      m.to_s
    end
  end
end
                                        foo
                                        bar
p = Prueba.new
                                        jander
M.each do |m|
                                        klander
  puts p.send(m)
end
Un ejemplo pequeño
(pero real) de algunas
 de estas cosas juntas
VALIDATION_METHODS = [:presence, :numericality, :format, :length, :acceptance, :confirmation]
VALIDATION_METHODS.each do |type|
  define_method quot;validates_#{type}_of_with_live_validationsquot;.to_sym do |*attr_names|
    send quot;validates_#{type}_of_without_live_validationsquot;.to_sym, *attr_names
    define_validations(type, attr_names)
  end
  alias_method_chain quot;validates_#{type}_ofquot;.to_sym, :live_validations
end
Un consejito
Usa módulos (mixins) para extender clases
Usa módulos (mixins) para extender clases




class String
  def italianize
    self.gsub(/[aeiou]/, 'i')
  end
end
Usa módulos (mixins) para extender clases




                                module Italianization
class String
                                  def italianize
  def italianize
                                    self.gsub(/[aeiou]/, 'i')
    self.gsub(/[aeiou]/, 'i')
                                  end
  end
                                end
end
                                String.send(:include, Italianization)
¿Y por qué?
¿Y por qué?



1. Gracias al const_missing de
   Rails, no importa el orden en
   que carguen las definiciones
¿Y por qué?



1. Gracias al const_missing de
   Rails, no importa el orden en
   que carguen las definiciones
2. Más fácil de depurar
¿Y por qué?



           1. Gracias al const_missing de
              Rails, no importa el orden en
              que carguen las definiciones
           2. Más fácil de depurar



String.ancestors
¿Y por qué?



           1. Gracias al const_missing de
              Rails, no importa el orden en
              que carguen las definiciones
           2. Más fácil de depurar



String.ancestors
>> [ String, Enumerable, Comparable, Object, Kernel ]
¿Y por qué?



           1. Gracias al const_missing de
              Rails, no importa el orden en
              que carguen las definiciones
           2. Más fácil de depurar



String.ancestors
>> [ String, Enumerable, Comparable, Object, Kernel ]
>> [ String, Italianization, Enumerable, Comparable, Object, Kernel ]
Recapitulando
1. Sé vago
1. Sé vago
2. Pero no te pases de listo
1. Sé vago
2. Pero no te pases de listo
3. Y testea
¿Preguntas, dudas?
¿Preguntas, dudas?
   ¿Opiniones?
Referencias

quot;Metaprogramming Ruby: Domain-Specific Languages for Programmersquot;, Glenn Vanderburg [www.vanderburg.org/Speaking/Stu /oscon05.pdf]
quot;The art of metaprogrammingquot;, Jonhathan Bartlett [http://www-128.ibm.com/developerworks/linux/library/l-metaprog1.html]
C2.com Wiki [http://c2.com/cgi/wiki?MetaProgramming]
http://api.rubyonrails.org/
Ola Bini [http://ola-bini.blogspot.com/]
Jay Fields [http://blog.jayfields.com/]
Nic Williams [http://drnicwilliams.com/]
Lambda the Ultimate [http://lambda-the-ultimate.org/]
LiveValidation Plugin [http://livevalidation.rubyforge.org]
Sofá Naranja [http://sofanaranja.com/2007/09/19/elogio-de-la-vagancia/]
Muchas gracias
   sergio.gil@the‐cocktail.com
     lacoctelera.com/porras
        the‐cocktail.com

Más contenido relacionado

Destacado

Aislaciones muros
Aislaciones murosAislaciones muros
Aislaciones murosgerardo696
 
Ensayo: Reforma a Telecomunicaciones
Ensayo: Reforma a TelecomunicacionesEnsayo: Reforma a Telecomunicaciones
Ensayo: Reforma a Telecomunicacionesvman7
 
Dictionary
DictionaryDictionary
DictionaryDan NNN
 
Trabajo Paracuellos
Trabajo ParacuellosTrabajo Paracuellos
Trabajo ParacuellosLuiseAsensio
 
Tema 6 proteinas stark
Tema 6 proteinas starkTema 6 proteinas stark
Tema 6 proteinas starkstela030
 
Clemar morales - Trabajo de Investigación
Clemar morales - Trabajo de InvestigaciónClemar morales - Trabajo de Investigación
Clemar morales - Trabajo de Investigacióndreamcoders
 
Sarah Abdullatif Al-Dossary CV updated
Sarah Abdullatif Al-Dossary CV updatedSarah Abdullatif Al-Dossary CV updated
Sarah Abdullatif Al-Dossary CV updatedSarah Aldossary
 
El Programa de Ganadería y Pesca en Nicaragua
 El Programa de Ganadería y Pesca en Nicaragua El Programa de Ganadería y Pesca en Nicaragua
El Programa de Ganadería y Pesca en NicaraguaILRI
 
Mente Salud PresentacióN Web V1
Mente Salud PresentacióN Web V1Mente Salud PresentacióN Web V1
Mente Salud PresentacióN Web V1hfrancob
 
Psi planificacion-sistema-informacion-primera-parte-22122-completo
Psi planificacion-sistema-informacion-primera-parte-22122-completoPsi planificacion-sistema-informacion-primera-parte-22122-completo
Psi planificacion-sistema-informacion-primera-parte-22122-completoMARCO POLO SILVA SEGOVIA
 
Léxico de Geología Económica
Léxico de Geología EconómicaLéxico de Geología Económica
Léxico de Geología Económicajpspyhacker
 
Memoria descriptiva contaminacion suelos
Memoria descriptiva contaminacion suelosMemoria descriptiva contaminacion suelos
Memoria descriptiva contaminacion suelosAmador Pfuro Tapia
 

Destacado (17)

Aislaciones muros
Aislaciones murosAislaciones muros
Aislaciones muros
 
Ensayo: Reforma a Telecomunicaciones
Ensayo: Reforma a TelecomunicacionesEnsayo: Reforma a Telecomunicaciones
Ensayo: Reforma a Telecomunicaciones
 
Dictionary
DictionaryDictionary
Dictionary
 
Trabajo Paracuellos
Trabajo ParacuellosTrabajo Paracuellos
Trabajo Paracuellos
 
Tema UE
Tema UETema UE
Tema UE
 
Tema 6 proteinas stark
Tema 6 proteinas starkTema 6 proteinas stark
Tema 6 proteinas stark
 
Clemar morales - Trabajo de Investigación
Clemar morales - Trabajo de InvestigaciónClemar morales - Trabajo de Investigación
Clemar morales - Trabajo de Investigación
 
Newsletter Agosto- Septiembre 2013 COLOMBIA GANADERA
Newsletter Agosto- Septiembre 2013 COLOMBIA GANADERANewsletter Agosto- Septiembre 2013 COLOMBIA GANADERA
Newsletter Agosto- Septiembre 2013 COLOMBIA GANADERA
 
Sarah Abdullatif Al-Dossary CV updated
Sarah Abdullatif Al-Dossary CV updatedSarah Abdullatif Al-Dossary CV updated
Sarah Abdullatif Al-Dossary CV updated
 
III Estudio de Inversión en Marketing y Publicidad Móvil
III Estudio de Inversión en Marketing y Publicidad MóvilIII Estudio de Inversión en Marketing y Publicidad Móvil
III Estudio de Inversión en Marketing y Publicidad Móvil
 
El Programa de Ganadería y Pesca en Nicaragua
 El Programa de Ganadería y Pesca en Nicaragua El Programa de Ganadería y Pesca en Nicaragua
El Programa de Ganadería y Pesca en Nicaragua
 
Mente Salud PresentacióN Web V1
Mente Salud PresentacióN Web V1Mente Salud PresentacióN Web V1
Mente Salud PresentacióN Web V1
 
Psi planificacion-sistema-informacion-primera-parte-22122-completo
Psi planificacion-sistema-informacion-primera-parte-22122-completoPsi planificacion-sistema-informacion-primera-parte-22122-completo
Psi planificacion-sistema-informacion-primera-parte-22122-completo
 
LBS Student Pitch Book January 2014
LBS Student Pitch Book January 2014LBS Student Pitch Book January 2014
LBS Student Pitch Book January 2014
 
Léxico de Geología Económica
Léxico de Geología EconómicaLéxico de Geología Económica
Léxico de Geología Económica
 
Memoria descriptiva contaminacion suelos
Memoria descriptiva contaminacion suelosMemoria descriptiva contaminacion suelos
Memoria descriptiva contaminacion suelos
 
Cities of tomorrow, URBACT thematic reports: Youth 1
Cities of tomorrow, URBACT thematic reports: Youth 1Cities of tomorrow, URBACT thematic reports: Youth 1
Cities of tomorrow, URBACT thematic reports: Youth 1
 

Similar a Metaprogramación (en Ruby): programas que escriben programas

¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticasjaespinmora
 
Workshop Camp México 09 - Introducción a Ruby
Workshop Camp México 09 - Introducción a RubyWorkshop Camp México 09 - Introducción a Ruby
Workshop Camp México 09 - Introducción a RubyEdgar Suarez
 
Javascript Básico
Javascript BásicoJavascript Básico
Javascript Básicocamposer
 
Lenguajec intorduccionui
Lenguajec intorduccionuiLenguajec intorduccionui
Lenguajec intorduccionui3dwin3
 
Jruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVMJruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVMjavier ramirez
 
Perl (practical extraction and report language)
Perl (practical extraction and report language)Perl (practical extraction and report language)
Perl (practical extraction and report language)Oliver Centeno
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyJose Juan R. Zuñiga
 
Java argumentos variables
Java argumentos variablesJava argumentos variables
Java argumentos variablesEfrain Mflo
 

Similar a Metaprogramación (en Ruby): programas que escriben programas (20)

Ruby 01
Ruby 01Ruby 01
Ruby 01
 
Ruby
Ruby Ruby
Ruby
 
¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas¿Cómo mantener tu javascript?: Buenas prácticas
¿Cómo mantener tu javascript?: Buenas prácticas
 
Idiomatic Ruby
Idiomatic RubyIdiomatic Ruby
Idiomatic Ruby
 
Workshop Camp México 09 - Introducción a Ruby
Workshop Camp México 09 - Introducción a RubyWorkshop Camp México 09 - Introducción a Ruby
Workshop Camp México 09 - Introducción a Ruby
 
Php
PhpPhp
Php
 
Perl1 escalares
Perl1 escalaresPerl1 escalares
Perl1 escalares
 
Javascript Básico
Javascript BásicoJavascript Básico
Javascript Básico
 
Ruby
RubyRuby
Ruby
 
Ruby intro
Ruby introRuby intro
Ruby intro
 
Tema2[php]
Tema2[php]Tema2[php]
Tema2[php]
 
Lenguajec intorduccionui
Lenguajec intorduccionuiLenguajec intorduccionui
Lenguajec intorduccionui
 
32773 php-basico
32773 php-basico32773 php-basico
32773 php-basico
 
Ruby para Java Developers
Ruby para Java DevelopersRuby para Java Developers
Ruby para Java Developers
 
Jruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVMJruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVM
 
Perl (practical extraction and report language)
Perl (practical extraction and report language)Perl (practical extraction and report language)
Perl (practical extraction and report language)
 
Taller completo
Taller completoTaller completo
Taller completo
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con Groovy
 
Introducción a Clojure
Introducción a ClojureIntroducción a Clojure
Introducción a Clojure
 
Java argumentos variables
Java argumentos variablesJava argumentos variables
Java argumentos variables
 

Más de Sergio Gil

Five Languages in a Moment
Five Languages in a MomentFive Languages in a Moment
Five Languages in a MomentSergio Gil
 
A [git] workflow
A [git] workflowA [git] workflow
A [git] workflowSergio Gil
 
Acceptance testing with Steak and Capybara
Acceptance testing with Steak and CapybaraAcceptance testing with Steak and Capybara
Acceptance testing with Steak and CapybaraSergio Gil
 
El Desarrollador Total
El Desarrollador TotalEl Desarrollador Total
El Desarrollador TotalSergio Gil
 
Buenas Prácticas de desarrollo en Ruby on Rails
Buenas Prácticas de desarrollo en Ruby on RailsBuenas Prácticas de desarrollo en Ruby on Rails
Buenas Prácticas de desarrollo en Ruby on RailsSergio Gil
 
Más allá del testing
Más allá del testingMás allá del testing
Más allá del testingSergio Gil
 
Ruby Mola (y por qué)
Ruby Mola (y por qué)Ruby Mola (y por qué)
Ruby Mola (y por qué)Sergio Gil
 

Más de Sergio Gil (9)

Five Languages in a Moment
Five Languages in a MomentFive Languages in a Moment
Five Languages in a Moment
 
A [git] workflow
A [git] workflowA [git] workflow
A [git] workflow
 
The Total IDE
The Total IDEThe Total IDE
The Total IDE
 
Acceptance testing with Steak and Capybara
Acceptance testing with Steak and CapybaraAcceptance testing with Steak and Capybara
Acceptance testing with Steak and Capybara
 
El Desarrollador Total
El Desarrollador TotalEl Desarrollador Total
El Desarrollador Total
 
Buenas Prácticas de desarrollo en Ruby on Rails
Buenas Prácticas de desarrollo en Ruby on RailsBuenas Prácticas de desarrollo en Ruby on Rails
Buenas Prácticas de desarrollo en Ruby on Rails
 
Más allá del testing
Más allá del testingMás allá del testing
Más allá del testing
 
Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
Ruby Mola (y por qué)
Ruby Mola (y por qué)Ruby Mola (y por qué)
Ruby Mola (y por qué)
 

Último

ejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sofejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sofJuancarlosHuertasNio1
 
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...JaquelineJuarez15
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...FacuMeza2
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 

Último (20)

ejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sofejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sof
 
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 

Metaprogramación (en Ruby): programas que escriben programas

  • 1. (en Ruby) Metaprogramación Programas que escriben programas Sergio Gil
  • 3. “Para qué voy a hacer [tarea X] si puedo escribir un programa que lo haga por mí” Cualquier programador, en cualquier momento, ante cualquier situación
  • 4. Programar no es una excepción
  • 6. Acercar el lenguaje al problema (para resolverlo mejor)
  • 7. Qué es la metaprogramación y de dónde ha salido semejante cosa
  • 8. puts quot;puts 'hola'quot; $ ruby -e quot;`ruby hola.rb`quot;
  • 9. Programas que escriben otros programas Programas que modifican su propio comportamiento (es decir, se escriben a sí mismos)
  • 10. “In Lisp, you don’t just write your program down toward the language, you also build the language up toward your program.” Paul Graham
  • 16. Metaprogramación en Rails • Generadores • Métodos mágicos
  • 17. Metaprogramación en Rails • Generadores • Métodos mágicos • method_missing
  • 18. Metaprogramación en Rails • Generadores • Métodos mágicos • method_missing • const_missing
  • 19. Metaprogramación en Rails • Generadores • Métodos mágicos • method_missing • const_missing • Definiciones dinámicas
  • 20. Metaprogramación en Rails • Generadores • Métodos mágicos • method_missing • const_missing • Definiciones dinámicas $ grep -r method_missing vendor/rails/ | wc -l 72
  • 21. Metaprogramación en Rails • Generadores • Métodos mágicos • method_missing • const_missing • Definiciones dinámicas $ grep -r method_missingvendor/rails/ ||wc -l const_missing vendor/rails/ wc -l 41 72
  • 22. Metaprogramación en Rails • Generadores • Métodos mágicos • method_missing • const_missing • Definiciones dinámicas $ grep -r method_missingvendor/rails/ ||wc -l define_method const_missing vendor/rails/ wc -l 67 41 72
  • 25. Generadores class ModelGenerator < Rails::Generator::NamedBase def manifest record do |m| m.directory File.join('app/models', class_path) m.directory File.join('test/unit', class_path) m.directory File.join('test/fixtures', class_path) m.template 'model.rb', File.join('app/models', class_path, quot;#{file_name}.rbquot;) m.template 'unit_test.rb', File.join('test/unit', class_path, quot;#{file_name}_test.rbquot;) m.template 'fixtures.yml', File.join('test/fixtures', quot;#{table_name}.ymlquot;) m.migration_template 'migration.rb', 'db/migrate', :assigns => { :migration_name => quot;Create#{class_name.pluralize.gsub(/::/, '')}quot; }, :migration_file_name => quot;create_#{file_path.gsub(///, '_').pluralize}quot; end end end
  • 27. method_missing class Array def method_missing(meth, *args, &blk) if meth.to_s =~ /^map_(.+)$/ map {|i| i.send($1)} else super end end end (1..5).to_a.map_to_s
  • 28. method_missing class Array def method_missing(meth, *args, &blk) if meth.to_s =~ /^map_(.+)$/ map {|i| i.send($1)} else super end end end (1..5).to_a.map_to_s >> [quot;1quot;, quot;2quot;, quot;3quot;, quot;4quot;, quot;5quot;]
  • 30. const_missing class Module alias :normal_const_missing :const_missing def const_missing(cname) return normal_const_missing(cname) rescue nil unless table_name = SchemaLookup.models[cname] raise NameError.new(quot;uninitialized constant #{cname}quot;) end klass = Class.new(ActiveRecord::Base) const_set cname, klass klass.set_table_name table_name klass end end
  • 31. alias
  • 32. alias class String alias :largo :length end puts quot;holaquot;.largo puts quot;holaquot;.length
  • 33. alias class String alias :largo :length end puts quot;holaquot;.largo 4 puts quot;holaquot;.length 4
  • 34. alias class String alias :largo :length end puts quot;holaquot;.largo 4 puts quot;holaquot;.length 4 class String alias :old_length :length def length old_length + 2 end end puts quot;holaquot;.length
  • 35. alias class String alias :largo :length end puts quot;holaquot;.largo 4 puts quot;holaquot;.length 4 class String alias :old_length :length def length old_length + 2 end end puts quot;holaquot;.length 6
  • 36. alias_method_chain (el estándar de Rails para añadir funcionalidad a un método preexistente)
  • 37. alias_method_chain (el estándar de Rails para añadir funcionalidad a un método preexistente) class String def length_with_message puts quot;Calculando longitud de #{self}quot; length_without_message end alias_method_chain :length, :message end puts quot;holaquot;.length
  • 38. alias_method_chain (el estándar de Rails para añadir funcionalidad a un método preexistente) class String def length_with_message puts quot;Calculando longitud de #{self}quot; length_without_message end alias_method_chain :length, :message end puts quot;holaquot;.length Calculando longitud de hola 4
  • 39. send y define_method la metaprogramación pata negra
  • 40. send
  • 41. send str = quot;Metaprogramacionguequot; puts str.upcase puts str.send(:upcase)
  • 42. send str = quot;Metaprogramacionguequot; puts str.upcase METAPROGRAMACIONGUE puts str.send(:upcase) METAPROGRAMACIONGUE
  • 43. send str = quot;Metaprogramacionguequot; puts str.upcase METAPROGRAMACIONGUE puts str.send(:upcase) METAPROGRAMACIONGUE [ :upcase, :downcase, :reverse ].each do |m| puts str.send(m) end
  • 44. send str = quot;Metaprogramacionguequot; puts str.upcase METAPROGRAMACIONGUE puts str.send(:upcase) METAPROGRAMACIONGUE [ :upcase, :downcase, :reverse ].each do |m| METAPROGRAMACIONGUE puts str.send(m) metaprogramaciongue end eugnoicamargorpateM
  • 46. define_method y def class Prueba def foo quot;fooquot; end define_method(:bar) do quot;barquot; end end p = Prueba.new puts p.foo puts p.bar
  • 47. define_method y def class Prueba def foo quot;fooquot; end define_method(:bar) do quot;barquot; end end p = Prueba.new puts p.foo foo puts p.bar bar
  • 49. ¿¿Y entonces?? class Prueba [ :foo, :bar, :jander, :klander ].each do |m| define_method(m) do m.to_s end end end p = Prueba.new puts p.foo puts p.bar puts p.jander puts p.klander
  • 50. ¿¿Y entonces?? class Prueba [ :foo, :bar, :jander, :klander ].each do |m| define_method(m) do m.to_s end end end p = Prueba.new foo puts p.foo bar puts p.bar jander puts p.jander klander puts p.klander
  • 51. Versión para realmente vagos M = [ :foo, :bar, :jander, :klander ] class Prueba M.each do |m| define_method(m) do m.to_s end end end foo bar p = Prueba.new jander M.each do |m| klander puts p.send(m) end
  • 52. Un ejemplo pequeño (pero real) de algunas de estas cosas juntas
  • 53. VALIDATION_METHODS = [:presence, :numericality, :format, :length, :acceptance, :confirmation] VALIDATION_METHODS.each do |type| define_method quot;validates_#{type}_of_with_live_validationsquot;.to_sym do |*attr_names| send quot;validates_#{type}_of_without_live_validationsquot;.to_sym, *attr_names define_validations(type, attr_names) end alias_method_chain quot;validates_#{type}_ofquot;.to_sym, :live_validations end
  • 55. Usa módulos (mixins) para extender clases
  • 56. Usa módulos (mixins) para extender clases class String def italianize self.gsub(/[aeiou]/, 'i') end end
  • 57. Usa módulos (mixins) para extender clases module Italianization class String def italianize def italianize self.gsub(/[aeiou]/, 'i') self.gsub(/[aeiou]/, 'i') end end end end String.send(:include, Italianization)
  • 59. ¿Y por qué? 1. Gracias al const_missing de Rails, no importa el orden en que carguen las definiciones
  • 60. ¿Y por qué? 1. Gracias al const_missing de Rails, no importa el orden en que carguen las definiciones 2. Más fácil de depurar
  • 61. ¿Y por qué? 1. Gracias al const_missing de Rails, no importa el orden en que carguen las definiciones 2. Más fácil de depurar String.ancestors
  • 62. ¿Y por qué? 1. Gracias al const_missing de Rails, no importa el orden en que carguen las definiciones 2. Más fácil de depurar String.ancestors >> [ String, Enumerable, Comparable, Object, Kernel ]
  • 63. ¿Y por qué? 1. Gracias al const_missing de Rails, no importa el orden en que carguen las definiciones 2. Más fácil de depurar String.ancestors >> [ String, Enumerable, Comparable, Object, Kernel ] >> [ String, Italianization, Enumerable, Comparable, Object, Kernel ]
  • 65.
  • 67. 1. Sé vago 2. Pero no te pases de listo
  • 68. 1. Sé vago 2. Pero no te pases de listo 3. Y testea
  • 69.
  • 71. ¿Preguntas, dudas? ¿Opiniones?
  • 72. Referencias quot;Metaprogramming Ruby: Domain-Specific Languages for Programmersquot;, Glenn Vanderburg [www.vanderburg.org/Speaking/Stu /oscon05.pdf] quot;The art of metaprogrammingquot;, Jonhathan Bartlett [http://www-128.ibm.com/developerworks/linux/library/l-metaprog1.html] C2.com Wiki [http://c2.com/cgi/wiki?MetaProgramming] http://api.rubyonrails.org/ Ola Bini [http://ola-bini.blogspot.com/] Jay Fields [http://blog.jayfields.com/] Nic Williams [http://drnicwilliams.com/] Lambda the Ultimate [http://lambda-the-ultimate.org/] LiveValidation Plugin [http://livevalidation.rubyforge.org] Sofá Naranja [http://sofanaranja.com/2007/09/19/elogio-de-la-vagancia/]
  • 73. Muchas gracias sergio.gil@the‐cocktail.com lacoctelera.com/porras the‐cocktail.com