metaprogramming
play

Metaprogramming Programs as Data Metaprogramming Programs that use - PowerPoint PPT Presentation

Metaprogramming Programs as Data Metaprogramming Programs that use other programs as data Examples: Compilers Templating and Generics Refactoring Tools Reflective Programming Programs that use themselves as data Examples:


  1. Metaprogramming Programs as Data

  2. Metaprogramming Programs that use other programs as data Examples: ● Compilers ○ Templating and Generics ● Refactoring Tools

  3. Reflective Programming Programs that use themselves as data Examples: ● Inspect variables, classes, and methods ● Create new variables, classes, and methods

  4. Ruby is a "scripting language" Also: ● Interpreted ● Reflective ● Object-oriented

  5. Ruby Everything is an object, including classes and methods Everything inherits from the class Object , including classes and methods

  6. Ruby Symbols are like global enums Used to identify methods and variables Examples: ● :foo ● :'1' ● :'@foo'

  7. Ruby Class Variable: @@var Instance Variable: @var An instance's class variables are a class's instance variables

  8. Ruby array.each do |obj| ... end (1..10).inject(0) {|m,n| m + n} def foo(arg, &block) ... end def greet @names.each {|n| yield n} end

  9. Ruby No multiple inheritance; mixins instead Inherited class variables aren't copied into the new class

  10. Ruby class A @@words = [] def <<(word) @@words << word end def print puts @@words.join(' ') end end class B < A; end class C < A; end (v0 = B.new) << 'hello' (v1 = C.new) << 'world'

  11. Object Methods class send instance_exec extend instance_variables method method_missing methods responds_to?

  12. Object Methods instance_variable_defined?(symbol) instance_variable_get(symbol) instance_variable_set(symbol, object) symbol looks like : '@name' "Sets the instance variable names by symbol to object , thereby frustrating the efforts of the class’s author to attempt to provide proper encapsulation." - Ruby Documentation

  13. Module Methods module_eval instance_method class_eval instance_methods class_variable_defined? method_defined? included

  14. Classes inherited callback Anonymous Classes How do you access klass = Class.new do class variables? method definitions end Klass.instance_variable_get Klass.instance_variable_set

  15. Use Cases: method_missing debugging dynamic function definition def method_missing(meth, *args, &block) if meth.to_s =~ / ^find_by_(.+)$ / error reporting run_find_by_method($1, *args, &block) else super end proxy objects end method families

  16. Use Cases: define_method reduce code duplication log = Logger.new meth = obj.method(name) form closures obj.define_method(name) do |*args| log.info("Called #{name}") meth.call(*args) code instrumentation end

  17. Case Study: RLTK::AST

  18. Case Study: RLTK::AST

  19. Case Study: RLTK::AST

  20. Case Study: RLTK::Parser Motivation: ● Subclass RLTK:: Problem: Superclass class Parser to create new variables are shared parsers between subclasses ● Define any number of parsers ● Instantiate any number of parsers

  21. Case Study: RLTK::Parser

  22. Questions?

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend