Ferramentas do usuário

Ferramentas do site


temas:programacao:fp

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anterior Revisão anterior
Próxima revisão
Revisão anterior
Última revisão Ambos lados da revisão seguinte
temas:programacao:fp [2015/10/11 15:31]
phil
temas:programacao:fp [2017/04/26 20:44]
phil
Linha 2: Linha 2:
 ====== Introdução ao Racket ====== ====== Introdução ao Racket ======
  
-Baixa o ambiente do Racket pra sua computador [[http://racket-lang.org/ aqui]]+Baixa o ambiente do Racket pra sua computador [[http://racket-lang.org/|aqui]]
  
  
Linha 17: Linha 17:
     (1 2 (3 4))     (1 2 (3 4))
  
-Expressões também são listas. Sempre o nome do operador ou função como primeiro elemento do lista e as operandos / argumentos depois.+Expressões também são listas. Sempre o nome do operador ou função como primeiro elemento do lista e as operandos / argumentos depois.
  
     (+ 2 2)     (+ 2 2)
Linha 40: Linha 40:
     (if (= 0 1) "sim" "nao")     (if (= 0 1) "sim" "nao")
  
-Obs : em Racket, o "verdade" '#t e "falso" '#f+Obs : em Racket, o "verdade" é #t e "falso" é #f
  
     (= 0 1)     (= 0 1)
Linha 61: Linha 61:
  
                  
-Obs : O marca do interligação pode ser utilizado nos nomes do funções e variáveis.+Obs : O ponto de interrogação pode ser utilizado nos nomes do funções e variáveis.
  
 Criando um nome, e vinculando um valor com o nome utilizar o função "define" Criando um nome, e vinculando um valor com o nome utilizar o função "define"
  
     (define x 15)     (define x 15)
- 
     (if (< 10 x) "sim" "nao")     (if (< 10 x) "sim" "nao")
  
Linha 73: Linha 72:
  
     (define (f x) (* x x))     (define (f x) (* x x))
- 
     (f 8)     (f 8)
  
Linha 90: Linha 88:
 ==== 2) As listas são sua estrutura de dados mais importante ==== ==== 2) As listas são sua estrutura de dados mais importante ====
  
-...+Nao podemos escrever um lista assim :  
 + 
 +    (1 2 3 4) 
 +     
 +    ERROR:  
 +    application: not a procedure; 
 +    expected a procedure that can be applied to arguments     
 +     
 +Pq? A Lisp sempre trata o primeiro item na lista como um funcaoPra falar sobre um lista sem tentar avaliar, precisamos o "quote". 
 + 
 +    '(1 2 3 4) 
 +     
 +Funções que produzam listas. 
 + 
 +    (list 1 2 3 4) 
 +    (range 10) 
 +     
 +Funções muito importante pra analisar / decompor as listas : car e cdr 
 + 
 +    (car '(1 2 3)) 
 + 
 +    (cdr '(1 2 3)) 
 + 
 + 
 +Podemos combinar : 
 + 
 +    (car (cdr '(1 2 3))) 
 + 
 +Construção das listas : 
 + 
 +    (list 1 2 3) 
 + 
 +Ou "cons", adicionar um elemento normal no inicio duma lista. 
 +     
 +    (cons "Calango" '("Hacker" "Clube")) 
 +     
 +Podemos escrever funções que moda / processar listas.  
 + 
 +    (define (vv xs) (cons (car (cdr xs)) (list (car xs)))) 
 +    (vv '("Visa" "Versa")) 
 + 
 +=== Execrisio 3. === 
 + 
 +Escrever um função que troca a segunda elemento dos duas listas.
  
 ==== 3) Recursividade é sua jeito de navegar dentro as estruturas ==== ==== 3) Recursividade é sua jeito de navegar dentro as estruturas ====
  
-...+    (define (tamanho xs)  
 +        (if (empty? xs) 0 (+ 1 (tamanho (cdr xs))))) 
 + 
 +    (tamanho '(1 2 3 4 5)) 
 +     
 + 
 +    (define (soma xs)  
 +        (if (empty? xs) 0 (+ (car xs) (soma (cdr xs))))) 
 +         
 + 
 +    (soma '(1 2 3 4 5))     
 + 
 +=== Exerciso 4.=== 
 + 
 +4.1 - Escrever um funciao pra multiplicar cada elemento duma lista vezes 3 
 + 
 +4.2 - Escrever um funciao pra produzir o ultimo elemento duma lista. 
 + 
 +4.3 - Escrever um funciao pra reversar uma lista, eg. '(1 2 3 4 5) -> '(5 4 3 2 1)
  
 ==== 4) Funções são cidadãos do primeiro classe ==== ==== 4) Funções são cidadãos do primeiro classe ====
  
-...+    (define (mult2 x) (* 2 x)) 
 + 
 +Podemos passar elas como argumentos : 
 +     
 +    (define (mymap f xs)  
 +      (if (empty? xs) '() 
 +          (cons (f (car xs)) (mymap f (cdr xs))))) 
 + 
 +    (mymap mult2 '(1 2 3 4 5)) 
 + 
 +Podemos produzir elas utilizando "curry" pra "customizar" funções que já existe : 
 + 
 +    (mymap (curry * 2) '(1 2 3 4 5)) 
 + 
 +Como nos queremos passar muitos pequenos funções como argumentos para outros funções, temos a capacidade definir funções anônimos com a "lambda". 
 + 
 +    (mymap (lambda (x) (* x 3)) '(1 2 3 4 5)) 
 +         
 +A biblioteca padrão contem varias funções pra tratar listas com outras funções 
 + 
 +    (map (curry * 4) '(1 2 3 4 5)) 
 + 
 +    (filter (lambda (x) (< x 5)) (range 10)) 
 + 
 +    (foldr (lambda (a b) (* a b)) 1 '(1 2 3 4 5)) 
 +     
 +=== Exerciso 5.=== 
 + 
 +Escrever o função que somar as números par dentro uma lista utilizando estas funções do biblioteca padrão. 
 + 
 +Escrever sua própria versão de filter  
  
 ===== E agora, vamos brincar ===== ===== E agora, vamos brincar =====
 +
 +    #lang racket
 +
 +    (require racket/draw)
 +    (require racket/gui) 
 +
 +    (define target (make-bitmap 400 400)) 
 +    (define dc (new bitmap-dc% [bitmap target]))
 +    (make-object image-snip% target)
 +
 +
 +    (define (:x p) (car p))
 +    (define (:y p) (cadr p))
 +
 +    (define (desenha dc forma cor) 
 +      (send dc set-pen cor 3 'solid)
 +      (if (< (sequence-length forma) 2) '()
 +          (let ([p1 (car forma)]
 +                [p2 (cadr forma)] )
 +            (send dc draw-line (:x p1) (:y p1) (:x p2) (:y p2))
 +            (desenha dc (cdr forma) cor) ) )
 +       )
 +
 +
 +    (define quad1 '( (0 0) (0 100) (100 100) (100 0) (0 0)))
 +    (define quad2 '( (100 200) (100 300) (200 300) (200 200) (100 200)))
 +
 +    (define cena (list quad1 quad2))
 +
 +    (define (repaint dc)
 +        (for ([forma cena])
 +            (desenha dc forma "green")
 +            )
 +        )  
 +
 +    (define frame (new frame%
 +                       [label "Tela"]
 +                       [width 400]
 +                       [height 400]))
 +
 +    (new canvas% [parent frame]
 +                 [paint-callback
 +                  (lambda (canvas dc)
 +                    (repaint dc)
 +                    )])
 +
 +    (send frame show #t)
 +
 +
 +        
 +Obs : Mais informacao dos funcoes do desenha em Racket sao aqui : http://docs.racket-lang.org/draw/overview.html    
 +
temas/programacao/fp.txt · Última modificação: 2017/04/26 20:45 por phil