Aqui você vê as diferenças entre duas revisões dessa página.
| Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
|
temas:programacao:fp [2015/10/11 15:34] phil |
temas:programacao:fp [2017/04/26 20:45] (atual) phil |
||
|---|---|---|---|
| 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 a 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 o 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 66: | Linha 66: | ||
| (define x 15) | (define x 15) | ||
| - | |||
| (if (< 10 x) " | (if (< 10 x) " | ||
| 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: | ||
| + | expected a procedure that can be applied to arguments | ||
| + | |||
| + | Pq? A Lisp sempre trata o primeiro item na lista como um funcao. Pra falar sobre um lista sem tentar avaliar, precisamos o " | ||
| + | |||
| + | '(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 " | ||
| + | |||
| + | Podemos escrever funções que moda / processar listas. | ||
| + | |||
| + | (define (vv xs) (cons (car (cdr xs)) (list (car xs)))) | ||
| + | (vv ' | ||
| + | |||
| + | === 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 " | ||
| + | |||
| + | (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 " | ||
| + | |||
| + | (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/ | ||
| + | (require racket/ | ||
| + | |||
| + | (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 ' | ||
| + | (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 " | ||
| + | ) | ||
| + | ) | ||
| + | |||
| + | (define frame (new frame% | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | (new canvas% [parent frame] | ||
| + | | ||
| + | (lambda (canvas dc) | ||
| + | (repaint dc) | ||
| + | )]) | ||
| + | |||
| + | (send frame show #t) | ||
| + | |||
| + | |||
| + | | ||
| + | Obs : Mais informacao dos funcoes do desenha em Racket sao aqui : http:// | ||
| + | |||