Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DSL - Domain Specific Languages

DSL - Domain Specific Languages

Gerenciamento de métodos, operadores e ações para construção de linguagens no escopo do programa.

Jean Carlo Emer

March 05, 2012
Tweet

More Decks by Jean Carlo Emer

Other Decks in Programming

Transcript

  1. DSL
    Domain Specific Languages
    Jean Carlo Emer

    View Slide

  2. Linguagem que se presta a
    resolver um problema
    específico.

    View Slide

  3. Muitas já não são?
    Ruby, PHP, JavaScript, XSL,
    PostScript, Emacs Lisp...

    View Slide

  4. 1.Invente uma sintaxe DSL e construa
    um interpretador ou compilador.
    2.Molde uma linguagem
    existente adicionando ou alterand
    o métodos, operadores, e ações
    padrões.

    View Slide

  5. LISP "permite criar" DSL
    Construção da linguagem no
    escopo do programa.

    View Slide

  6. with Employee "123-45-6789" do
    salary -1000
    warn :misconduct
    end

    View Slide

  7. ● 100% objetos / não, não é a OO de Java
    ● 100% aberto / DSL?
    ● Indicadores de Métodos / ? ! = []=
    ● Parênteses podem ser omitidos

    View Slide

  8. ● Numeric 1, 2, 3.1
    ● String "String"
    ● Symbol :Symbol
    ● Array [1, 'string', 3, [], {}, "oi"]
    ● Hash {'tabela' => 'valor'}
    ● Regexp /regexp/

    View Slide

  9. class Pessoa
    attr_reader :nome, :idade
    def initialize(nome, idade)
    @nome, @idade = nome, idade
    end
    end

    View Slide

  10. class Pessoa
    def >(pessoa)
    self.idade > pessoa.idade
    end
    end
    puts Pessoa.new("-", 22) > Pessoa.new("--", 44)

    View Slide

  11. 4.months + 3.weeks + 2.days

    View Slide

  12. 4.months() + 3.weeks() + 2.days()

    View Slide

  13. 4.months()+(3.weeks()+(2.days()))
    Faz sentido?
    A propósito, é nome de filme, assistam!

    View Slide

  14. class Fixnum
    def impar?
    self%2 == 1
    end
    end
    0.impar?

    View Slide

  15. class Tabuleiro
    def [](lin, col)
    col *= 2
    (@linhas[lin] & (Peca::Qualquer << col)) >> col
    end
    end
    t[0,1] = Peca::Branca

    View Slide

  16. class Pessoa
    def method_missing(m, *args, &block)
    puts "Ninguém chamado #{m} por aqui "
    end
    end
    Pessoa.new.jeancarloemer
    @variable ||= "valor padrão"

    View Slide

  17. class String
    def *(s)
    ...
    end
    end
    "a" * "ba"
    Já existe "a"*3 que resulta em "aaa"

    View Slide

  18. Fim!
    [email protected]
    inf.ufrgs.br/~jcemer
    @jcemer

    View Slide