ParseTree permite formas bastante avançadas de reflexão sobre código Ruby.
Com seu uso, podemos até mudar completamente a forma como o código Ruby é interpretado!
A palestra passa por alguns usos divertidos e interessantes, desde análise estática de
código, até técnicas para construção de Domain Specific Languages.
6. Metaprogramação
class Aluno
end
marcos = Aluno.new
marcos.respond_to? :programa # => false
class Professor
def ensina(aluno)
def aluno.programa
quot;puts 'agora sei programar'quot;
end
end
end
knuth = Professor.new
knuth.ensina marcos
marcos.respond_to? :programa
# => true
marcos.programa
# => quot;puts 'agora sei programar'quot;
14. SexpProcessor
class TheProcessor < SexpProcessor
def process_call(node)
# ...
process node
end
def process_class(node)
# ...
process node
end
def process_scope(node)
# ...
process node
end
end
15. SexpProcessor
class TheProcessor < SexpProcessor
def process_call(node)
# ...
ast = ParseTree.new.process(...)
process node
new_ast = TheProcessor.new.process(ast)
end
def process_class(node)
# ...
process node
end
def process_scope(node)
# ...
process node
end
end
16. class
nil scope
Person
defn
say_hi args scope
block
class RenameProcessor < SexpProcessor
call
def process_defn(node) puts
nil arglist
name = node.shift
str
args = process(node.shift)
scope = process(node.shift) “hi”
s(:defn, :quot;new_#{name}quot;, args, scope)
end
end
17. Flog
Flog shows you the most
torturous code you wrote. class Test
def blah # 11.2 =
The more painful the a = eval quot;1+1quot; # 1.2 + 6.0 +
code, the higher the score. if a == 2 then # 1.2 + 1.2 + 0.4 +
The higher the score, the puts quot;yayquot; # 1.2
end
harder it is to test. end
end