Aprenda e entenda mais sobre Ruby criando sua própria ... filelinguagem de programação Friday,...

99
José Valim @josevalim blog.plataformatec.com Aprenda e entenda mais sobre Ruby criando sua própria linguagem de programação Friday, November 4, 2011

Transcript of Aprenda e entenda mais sobre Ruby criando sua própria ... filelinguagem de programação Friday,...

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

Eu trabalho nablog.plataformatec.com.br

Friday, November 4, 2011

Core Team Member

Friday, November 4, 2011

Friday, November 4, 2011

Friday, November 4, 2011

ElixirOrientação a Objetos e

sintaxe elegante para a Erlang VM

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

ElixirOrientação a Objetos e

sintaxe elegante para a Erlang VM

Friday, November 4, 2011

<3 Ruby <3

Friday, November 4, 2011

Friday, November 4, 2011

@tenderl♥veFriday, November 4, 2011

* O que eu aprendi sobre o Ruby

* E se?

Friday, November 4, 2011

O que eu aprendi sobre o Ruby

Friday, November 4, 2011

Sobre a sintaxe

Friday, November 4, 2011

puts “hi”

Friday, November 4, 2011

puts “hi” Lexer

Friday, November 4, 2011

puts “hi” Lexer[:identifier, “puts”],[:string, “hi”]

Friday, November 4, 2011

puts “hi” Lexer[:identifier, “puts”],[:string, “hi”]

Parser

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

Gramática flexível

Friday, November 4, 2011

def foo 1endfoo #=> 1self.foo #=> 1

Friday, November 4, 2011

def foo 1endfoo #=> 1self.foo #=> 1

foo = 2foo #=> 2self.foo #=> 1

Friday, November 4, 2011

foo

Friday, November 4, 2011

foo Lexer

Friday, November 4, 2011

foo Lexer

[:identifier, “foo”]

Friday, November 4, 2011

foo Lexer

[:identifier, “foo”]

Parser

Friday, November 4, 2011

foo Lexer

[:identifier, “foo”]

[:identifier, “foo”]

Parser

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

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

Friday, November 4, 2011

def bar(arg) arg.classendbar /foo/m

Friday, November 4, 2011

def bar(arg) arg.classendbar /foo/m

bar, foo, m = 0, 1, 2bar /foo/m

Friday, November 4, 2011

Friday, November 4, 2011

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

Friday, November 4, 2011

Quiz

array = [1,2,3]

Friday, November 4, 2011

Quiz

array = [1,2,3]array.length+1

Friday, November 4, 2011

Quiz

array = [1,2,3]array.length+1#=> 4

Friday, November 4, 2011

Quiz

array = [1,2,3]array.length+1#=> 4

array.length +1

Friday, November 4, 2011

Quiz

array = [1,2,3]array.length+1#=> 4

array.length +1#=> ArgumentError

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

O “Object Model”

Friday, November 4, 2011

object = Object.newdef object.greet(name) puts "Hello #{name}"endobject.greet("Matz")

Friday, November 4, 2011

Métodos em Ruby são armazenados

em módulos

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

Person.is_a?(Module) #=> trueClass.superclass #=> Module

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]

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

E se?

Friday, November 4, 2011

... não existissem blocos?

Friday, November 4, 2011

<3 Blocos <3

Friday, November 4, 2011

File.open "rubyconf.txt" do |f| f.write "ao vivo"end

Friday, November 4, 2011

File.open "rubyconf.txt", do |f| f.write "ao vivo"end

Friday, November 4, 2011

File.open "rubyconf.txt", do |f| f.write "ao vivo"end

Friday, November 4, 2011

File.open("rubyconf.txt", do |f| f.write "ao vivo"end)

Friday, November 4, 2011

do_it = do |f| f.write "ao vivo"end

File.open "rubyconf.txt", do_it

Friday, November 4, 2011

Sem blocos

+ Não precisamos mais de yield, &block

+ Passar mais de um bloco é mais natural

Friday, November 4, 2011

... tivessemos Array e Hash

comprehensions?

Friday, November 4, 2011

n = [1,2,3,4]

[x * 2 for x in n]

# => [2,4,6,8]

Friday, November 4, 2011

n = [1,2,3]

[x * 2 for x in n, x.odd?]

# => [2,6]

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

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

... tivessemos interfaces?

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

... tivessemos partial application?

Friday, November 4, 2011

_ tem semântica especial em diversas linguagens

de programação

Friday, November 4, 2011

_ = 1_ # => nil

Friday, November 4, 2011

x, *_ = [1,2,3,4,5]

Friday, November 4, 2011

Invés de:

names.each { |x| puts(x) }

Friday, November 4, 2011

Invés de:

names.each { |x| puts(x) }

Poderíamos:

names.each &puts(_)

Friday, November 4, 2011

puts(_)#=> lambda { |x| puts(x) }

respond_to?(_, _)#=> lambda { |x,y| respond_to?(x,y) }

Friday, November 4, 2011

Resumindo ...

Friday, November 4, 2011

<3 Elixir <3github.com/josevalim/elixir

Friday, November 4, 2011

createyourproglang.com

Friday, November 4, 2011

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