programs as data - university of colorado boulder · metaprogramming programs as data....

22
Metaprogramming Programs as Data

Upload: others

Post on 14-May-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Questions?