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.
Download

5COP101_Aula3 - Sylvio Barbon Junior