![Page 1: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/1.jpg)
MetaprogrammingPrograms as Data
![Page 2: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/2.jpg)
MetaprogrammingPrograms that use other programs as data Examples:
● Compilers○ Templating and Generics
● Refactoring Tools
![Page 3: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/3.jpg)
Reflective ProgrammingPrograms that use themselves as data Examples:
● Inspect variables, classes, and methods● Create new variables, classes, and
methods
![Page 4: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/4.jpg)
Rubyis a "scripting language" Also:
● Interpreted● Reflective● Object-oriented
![Page 5: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/5.jpg)
RubyEverything is an object, including classes and methods Everything inherits from the class Object, including classes and methods
![Page 6: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/6.jpg)
RubySymbols are like global enums Used to identify methods and variables Examples:
● :foo● :'1'● :'@foo'
![Page 7: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/7.jpg)
Ruby
Class Variable: @@var Instance Variable: @var An instance's class variables are a class's instance variables
![Page 8: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/8.jpg)
Rubyarray.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
![Page 9: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/9.jpg)
RubyNo multiple inheritance; mixins instead Inherited class variables aren't copied into the new class
![Page 10: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/10.jpg)
Rubyclass 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'
![Page 11: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/11.jpg)
Object Methods
classsendextendmethodmethodsresponds_to?
instance_execinstance_variablesmethod_missing
![Page 12: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/12.jpg)
Object Methodsinstance_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
![Page 13: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/13.jpg)
Module Methods
module_evalclass_evalclass_variable_defined?included
instance_methodinstance_methodsmethod_defined?
![Page 14: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/14.jpg)
Classesinherited callback How do you access class variables? Klass.instance_variable_getKlass.instance_variable_set
Anonymous Classes klass = Class.new do
method definitionsend
![Page 15: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/15.jpg)
Use Cases: method_missingdebugging dynamic function definition error reporting proxy objects method families
def method_missing(meth, *args, &block) if meth.to_s =~ /^find_by_(.+)$/ run_find_by_method($1, *args, &block) else super
endend
![Page 16: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/16.jpg)
Use Cases: define_method
reduce code duplication form closures code instrumentation
log = Logger.new
meth = obj.method(name)
obj.define_method(name) do |*args|
log.info("Called #{name}")
meth.call(*args)
end
![Page 17: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/17.jpg)
Case Study: RLTK::AST
![Page 18: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/18.jpg)
Case Study: RLTK::AST
![Page 19: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/19.jpg)
Case Study: RLTK::AST
![Page 20: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/20.jpg)
Case Study: RLTK::ParserMotivation:● Subclass RLTK::
Parser to create new parsers
● Define any number of parsers
● Instantiate any number of parsers
Problem: Superclass class variables are shared between subclasses
![Page 21: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/21.jpg)
Case Study: RLTK::Parser
![Page 22: Programs as Data - University of Colorado Boulder · Metaprogramming Programs as Data. Metaprogramming Programs that use other programs as data Examples: Compilers Templating and](https://reader030.vdocument.in/reader030/viewer/2022041011/5ebd48eca1055014233c2a7b/html5/thumbnails/22.jpg)
Questions?