5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP 5COP101 Linguagens de Programação Aula 3 Clojure/LISP Prof. Dr. Sylvio Barbon Junior Sylvio Barbon Jr – [email protected] 1 5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP Sumário 1) Controle de Fluxo 2)Funções Recursivas com a Clojure 3) Coleções e Estruturas de Dados Sylvio Barbon Jr – [email protected] 2 5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP Controle de Fluxo - if (defn is-small? [number] (if (< number 100) "yes" "no")) - if-not (Se a lógica for falsa) (defn has-neg [coll] (if-not (empty? coll) ;; = (if (not (empty? coll)) ... (or (neg? (first coll)) (recur (rest coll))))) - if-let (Se o teste for verdade os valores dos testes são “amarrados”) user=> (defn sum-even-numbers [nums] (if-let [nums (seq (filter even? nums))] (reduce + nums) "No even numbers found.")) Sylvio Barbon Jr – [email protected] 3 5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP Controle de Fluxo - when ( Se for verdade executa um do “implícito”, apresenta as variações when-not e when-let) (when (= 1 1) true) (defn drop-one [coll] (when-let [s (seq coll)] (rest s))) - do (Avalia múltiplas expressões em ordem e retorna o valor da última expressão) (do (println "LOG: Computing...") (+ 1 1)) Sylvio Barbon Jr – [email protected] 4 5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP Controle de Fluxo - loop (constrói uma estrutura recursiva) (loop [x 10] (when (> x 1) (println x) (recur (- x 2)))) (defn my-re-seq [re string] "Something like re-seq" (let [matcher (re-matcher re string)] (loop [match (re-find matcher) result []] (if-not match result (recur (re-find matcher) (conj result match)))))) user=> (my-re-seq #"\d" "0123456789") ["0" "1" "2" "3" "4" "5" "6" "7" "8" "9"] Sylvio Barbon Jr – [email protected] 5 5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP Controle de Fluxo - while (Executa o escopo repetidamente enquanto for true) user=> (def a (atom 10)) #'user/a user=> (while (pos? @a) (do (println @a) (swap! a dec))) Sylvio Barbon Jr – [email protected] 6 5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP Recursão - A recursão pode ser implementada, como tradicionalmente, tendo a função invocando ela mesma até que seja atingido um critério de parada. (defn count-down [n] (if-not (zero? n) (do (if (= 0 (rem n 10)) (println "count-down:" n)) (count-down (dec n))))) - Para evitar eventuais sobrecargas na pilha pode-se utilizar a função recur (defn count-downr [n] (if-not (zero? n) (do (if (= 0 (rem n 100)) (println "count-down:" n)) (recur (dec n))))) Sylvio Barbon Jr – [email protected] 7 5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP - count: retorna o número de itensde de uma coleção Coleções e Estruturas Dados - empty: retorna uma mesma coleção vazia - contains?: retorna true se a chave está presente na coleção - distinct?: retorna true se dois argumentos são iguais - emplty?: retorna true se a coleção não tem itens - senquential?, associative?, sorted?, counted? e reversible? : retornam se os itens são de respectivas classes. user=> (count [1 2 3]) 3 user=> (contains? {:a 1} :a) true user=> (sorted? [1 2 3 4 5]) false user=> (sorted? (sorted-map :a 1 :c 3 :b 2)) Sylvio Barbon Jr – [email protected] true 8 5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP Coleções e Estruturas de Dados - Set é uma coleção de valores únicos; (def p #{1, 2, 3}) - Set apresenta os métodos: union, intersection e difference. (def a #{1, 2, 3, 4}) (def b #{1, 3, 5}) user=> (clojure.set/union a b) #{1 2 3 4 5} user=> (clojure.set/intersection a b) #{1 3} user=> (clojure.set/difference a b) #{2 4} Sylvio Barbon Jr – [email protected] 9 5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP Coleções e Estruturas de Dados - Sequence é uma lista com n cópias de um objeto; user=> (repeat 10 “a”) ;; (“a” “a” “a” “a” “a” “a” “a” “a” “a” “a”) - Algumas funções úteis com sequences: rand-int, concat, cycle, rand e iterate user=> (def aleatorios (repeatedly #(rand-int 100))) user=> (concat [1 3 ] [ 3 4 3] [3 3]) ;; (1 3 3 4 3 3 3) user=> (def x (cycle [1 2 3])) ;; lista infinita ;; (1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3) user=> (def inteiros (interate inc 0)) (take 4 inteiros) ;; => ( 0 1 2 3 ) Sylvio Barbon Jr – [email protected] 10 5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP Referências 5COP101 – Linguagens de Programação Aula 3 – Clojure/LISP Referências 1- Sebesta, R. Conceitos de Linguagens de Programação. 5ª Edição. Porto Alegre. Bookman, 2003. 2 – Chas Emerick, Brian Carper, Christophe Gand, Clojure Programming., O'really, 2012.