aprenda e entenda mais sobre ruby criando sua própria ... filelinguagem de programação friday,...
Post on 08-Feb-2019
213 Views
Preview:
TRANSCRIPT
José Valim @josevalimblog.plataformatec.com
Aprenda e entenda mais sobre Ruby criando sua própria
linguagem de programação
Friday, November 4, 2011
blog twitterID
José Valim @josevalimblog.plataformatec.com
Aprenda e entenda mais sobre Ruby criando sua própria
linguagem de programação
Friday, November 4, 2011
Erlang VM
+ Processos concorrentes
+ Baseados em mensagems
+ “Hot Code Swapping”
+ Baixo consumo de memória
Friday, November 4, 2011
A Linguagem Erlang
+ Pequena e fácil de aprender
+ Programação funcional
- Sintaxe burocrática
- Falta “Orientação a Objetos”
Friday, November 4, 2011
puts “hi” Lexer[:identifier, “puts”],[:string, “hi”]
[:call, “puts”,[ [:string, “hi”]]]
Parser
Friday, November 4, 2011
puts “hi” Lexer[:identifier, “puts”],[:string, “hi”]
[:call, “puts”,[ [:string, “hi”]]]
Parser
SemanticAnalysis
Friday, November 4, 2011
puts “hi” Lexer[:identifier, “puts”],[:string, “hi”]
[:call, “puts”,[ [:string, “hi”]]]
Parser
SemanticAnalysis [:call, “puts”,[
[:string, “hi”]]]
Friday, November 4, 2011
puts “hi” Lexer[:identifier, “puts”],[:string, “hi”]
[:call, “puts”,[ [:string, “hi”]]]
Parser
SemanticAnalysis [:call, “puts”,[
[:string, “hi”]]]
Native /Bytecode
Friday, November 4, 2011
puts “hi” Lexer[:identifier, “puts”],[:string, “hi”]
[:call, “puts”,[ [:string, “hi”]]]
Parser
SemanticAnalysis [:call, “puts”,[
[:string, “hi”]]]
Native /Bytecode
Friday, November 4, 2011
foo Lexer
[:identifier, “foo”]
[:identifier, “foo”]
Parser
SemanticAnalysis
Friday, November 4, 2011
foo Lexer
[:identifier, “foo”]
[:identifier, “foo”]
Parser
SemanticAnalysis ?
Friday, November 4, 2011
foo Lexer
[:identifier, “foo”]
[:identifier, “foo”]
Parser
SemanticAnalysis
Native /Bytecode
?
Friday, November 4, 2011
def bar foo = 1 fooend
[:method,:bar,[ [:assign, "foo", [:integer,1]], [:identifier,"foo"]]]
lexer + parser
Friday, November 4, 2011
def bar foo = 1 fooend
[:method,:bar,[ [:assign, "foo", [:integer,1]], [:identifier,"foo"]]]
lexer + parser
[:method,:bar,[ [:assign, "foo", [:integer,1]], [:var,"foo"]]]
semantic analysis
Friday, November 4, 2011
def show @user = User.find(self.params[:id]) if @user.name =~ %r/^Ph\.D/i self.render :action => "show" else self.flash[:notice] = "Ph.D required" self.redirect_to "/" endend
Friday, November 4, 2011
def show @user = User.find(params[:id]) if @user.name =~ /^Ph\.D/i render :action => "show" else flash[:notice] = "Ph.D required" redirect_to "/" endend
Friday, November 4, 2011
Quiz
array = [1,2,3]array.length+1#=> 4
array.length +1#=> ArgumentError
array.length + 1
Friday, November 4, 2011
Quiz
array = [1,2,3]array.length+1#=> 4
array.length +1#=> ArgumentError
array.length + 1#=> 4
Friday, November 4, 2011
object = Object.newdef object.greet(name) puts "Hello #{name}"endobject.greet("Matz")
Friday, November 4, 2011
module Greeter def greet(name) "Hello #{name}" endend
class Person include Greeterend
Person.new.greet "Matz"
Friday, November 4, 2011
class Person def greet(name) "Hello #{name}" endend
Person.new.greet "Matz"
Friday, November 4, 2011
object = Object.newdef object.greet(name) puts "Hello #{name}"endobject.greet("Matz")
Friday, November 4, 2011
object.class.ancestors#=> [Object, Kernel, BasicObject]
object.class.ancestors.any? do |r| r.method_defined?(:greet)end#=> false
Friday, November 4, 2011
object.class.ancestors#=> [Object, Kernel, BasicObject]
object.class.ancestors.any? do |r| r.method_defined?(:greet)end#=> false
object.singleton_class. method_defined?(:greet)#=> true
Friday, November 4, 2011
object.class.ancestors#=> [Object, Kernel, BasicObject]
object.class.ancestors.any? do |r| r.method_defined?(:greet)end#=> false
object.singleton_class. method_defined?(:greet)#=> true
object.singleton_class.is_a?(Module)#=> true
Friday, November 4, 2011
object = Object.newdef object.greet(name) puts "Hello #{name}"endobject.greet("Matz")
Friday, November 4, 2011
Sem blocos
+ Não precisamos mais de yield, &block
+ Passar mais de um bloco é mais natural
Friday, November 4, 2011
n = [1,2,3,4]
{x => y for x in n, y in n, x * x == y}
# => { 1 => 1, 2 => 4 }
Friday, November 4, 2011
def form_for(object) case object when Hash # ... when Array # ... else # ... endend
Friday, November 4, 2011
def form_for(object :: Hash) # ...end
def form_for(object :: Array) # ...end
def form_for(object) # ...end
Friday, November 4, 2011
+ Facilita manutenção
+ Facilita documentação
- Não tem duck typing
Multi-methods
Friday, November 4, 2011
Haskell / Go interfaces
interface ActiveModel::Compliance def :to_key def :persisted?end
def form_for(object :: ActiveModel::Compliance) # ...end
Friday, November 4, 2011
puts(_)#=> lambda { |x| puts(x) }
respond_to?(_, _)#=> lambda { |x,y| respond_to?(x,y) }
Friday, November 4, 2011
José Valim @josevalimblog.plataformatec.com
Perguntas?
Friday, November 4, 2011
blog twitterID
José Valim @josevalimblog.plataformatec.com
Perguntas?
Friday, November 4, 2011
Estamos contratando!trabalhe@plataformatec.com.br
Friday, November 4, 2011
top related