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
temas:programacao:fp [2015/10/11 15:31]
phil
temas:programacao:fp [2017/04/26 20:45] (atual)
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 25: Linha 25:
 === Exerciso 1.=== === Exerciso 1.===
  
-Traduze esta expressão em Lisp e avalia no sua computador+Traduze esta expressão em Lisp e avalia no seu computador
        
     3 * (5 + 9)     3 * (5 + 9)
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.1444577492.txt.gz · Última modificação: 2015/10/11 15:31 por phil