Slide 1

Slide 1 text

DSL Domain Specific Languages Jean Carlo Emer

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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.

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

4.months + 3.weeks + 2.days

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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