2. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
PARTE 3 - PARADIGMA FUNCIONAL
PROGRAMAÇÃO FUNCIONAL EM LISP
AULA 3
2 / 22
3. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Roteiro
1 Elementos Intrínsecos de Programação Funcional
2 Ordenamento
3 Igualdade e Identidade
4 Funções para listas
3 / 22
4. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Funcall
Chama uma função passando seus argumentos.
1 (defun soma (x y) (+ x y))
2 SOMA
3 > (soma 2 3)
4 5
5 > (funcall #’soma 2 3)
6 5
4 / 22
5. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Apply
Apply é semelhante a Funcall, exceto que seu argumento final deverá ser uma lista. Os
elementos desta lista são tratados como se fossem argumentos adicionais ao Funcall.
1 > (apply #’soma ’(5 6))
2 11
3 > (apply #’+ 3 4 ’(3 4))
4 14
5 / 22
6. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Maps - mapcar
O primeiro argumento a mapcar deve ser uma função de um argumento. mapcar aplica
esta função a cada elemento de uma lista dada e coleta os resultados em uma outra
lista.
1 > (defun dobro (x) (* 2 x))
2 DOBRO
3 > (dobro 2)
4 4
5 > (mapcar #’dobro ’(1 2 3 4))
6 (2 4 6 8)
7 > (mapcar #’not ’(t nil t nil t nil))
8 (NIL T NIL T NIL T)
6 / 22
7. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Funções Lambda
Funções anônimas temporárias.
1 (setq quadrado (lambda (x) (* x x)))
2 #<FUNCTION :LAMBDA (X) (* X X)>
3 [15]> (funcall quadrado 2)
4 4
5 >#’(lambda (x) (+ x 3))
6 #<FUNCTION :LAMBDA (X) (+ X 3)>
7 > (funcall * 5) ;observe que neste contexto o * é uma
8 ;variável que representa o último form
9 ;que foi digitado..
10 8
7 / 22
8. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Lambda com Mapcar
A combinação de lambda e mapcar pode substituir muitos laços. Por exemplo, os dois
forms seguintes são equivalentes:
1 > (do ((x ’(1 2 3 4 5) (cdr x))
2 (y nil))
3 (( null x) (reverse y))
4 (push (+ (car x) 2) y)
5 )
6 (3 4 5 6 7)
7 > (mapcar #’(lambda (x) (+ x 2)) ’(1 2 3 4 5))
8 (3 4 5 6 7)
8 / 22
9. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Ordenamento
LISP provê duas primitivas para ordenação: sort e stable-sort.
1 > (sort ’(2 1 5 4 6) #’<)
2 (1 2 4 5 6)
3 > (sort ’(2 1 5 4 6) #’>)
4 (6 5 4 2 1)
O primeiro argumento para sort é uma lista, o segundo é a função de comparação. A
função de comparação não garante estabilidade.
9 / 22
10. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Ordenamento Estável
A função stable-sort é exatamento como sort, só que ela garante que dois elementos
equivalentes vão aparecer na lista ordenada exatamente na mesma ordem em que
aparecem lista original.
1 >(stable -sort ’(2 1 5 4 6) #’>)
2 (6 5 4 2 1)
3 > (stable -sort ’(2 1 5 4 6) #’<)
4 (1 2 4 5 6)
Atenção: O sort pode modificar ou apagar a lista original. Para fazer cópias use
copy-list ou copy-seq
10 / 22
11. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Copiando a Lista
1 >(setq nova (copy -list ’(1 2 3 4)))
2 (1 2 3 4)
3 ; outra forma
4 > (setq nova (copy -seq ’(1 2 3 4)))
5 (1 2 3 4)
6 > nova
7 (1 2 3 4)
11 / 22
12. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Igualdade e Identidade
Dois símbolos são eq se e somente se eles forem idênticos (identidade). Duas cópias da
mesma lista não são eq (são dois objetos diferentes) mas são equal (iguais).
1 > (eq ’a ’a)
2 T
3 > (eq ’a ’b)
4 NIL
5 > (= 3 4)
6 NIL
7 > (eq ’(a b c) ’(a b c))
8 NIL
9 > (equal ’(a b c) ’(a b c))
10 T
11 > (eql ’a ’a)
12 T
13 > (eql 3 3)
14 T
12 / 22
13. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Igualdade e Identidade
Detalhes:
• O predicado eql é equivalente a eq para símbolos e a = para números. É a
identidade que serve tanto para números como para símbolos.
• O predicado equal é equivalente eql para símbolos e números. Ele é verdadeiro
para dois conses, se e somente se, seus cars são equal e seus cdrs são equal. Ele é
verdadeiro para duas estruturas se e somente se as estruturas forem do mesmo
tipo e seus campos correspondentes forem equal.
13 / 22
14. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Exemplos de Igualdade e Identidade
Mais exemplos:
1 >(setq X ’(A B))
2 (A B)
3 > (setq Y ’(A B))
4 (A B)
5 > (equal X Y) ;X e Y são iguais
6 T
7 > (eq X Y) ;X e Y não são idênticos
8 NIL
14 / 22
15. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Append
A função append adiciona uma lista ou elemento à outra.
1 >(append ’(1 2 3) ’(4 5 6))
2 (1 2 3 4 5 6)
15 / 22
16. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Reverse
Reverte os elementos de uma lista.
1 > (reverse ’(1 2 3))
2 (3 2 1)
16 / 22
17. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
member
Verifica se um elemento é menbro de uma lista.
1 > (member ’a ’(b d a c))
2 (A C)
3 > (member ’e ’(b d a c))
4 NIL
17 / 22
18. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
find
Encontra um elemento ou uma sublista em uma lista. A sua sintaxe é
(find item lista :key funcao :test predicado)
• item é o elemento a encontrar
• lista é a lista onde vamos procurar o elemento
• funcao :key é uma função opcional que aplica uma transformação aos elementos
da lista antes de compará-los
• :test é um predicado opcional que especifica como comparar os elementos.
18 / 22
19. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Exemplos de find
Encontrar o número 5 na lista (1 2 3 4 5 6 7)
1 (find 5 ’(1 2 3 4 5 6 7))
2 5
Encontrar o número 5 na lista ((1 2) (3 4) (5 6) (7 8)), que é uma lista de listas.
1 > (find 5 ’((1 2) (3 4) (5 6) (7 8)) :key #’car)
2 (5 6)
Encontrar múltiplo de 5 na lista 10 20 30 40 50 60 70).
1 >(find 5 ’(10 20 30 40 50 60 70) :test #’= :key #’(lambda (x) (/
x 10)))
2 50
19 / 22
20. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
subsetp
Verificação de subconjunto.
1 >(subsetp ’(a b) ’(a d e))
2 NIL
3 > (subsetp ’(a d) ’(a d e))
4 T
20 / 22
21. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
union intersection difference
União,interseção e diferença de conjuntos.
1 >(union ’(a) ’(b))
2 (A B)
3 >(intersection ’(a b c) ’(b))
4 (B)
5 > (set -difference ’(a b) ’(a))
6 (B)
Subsetp, intersection, union, e set-difference todos assumem que cada argumento não
contém elementos duplicados. Eles também podem todos tomar um argumento :test.
Por default, todos usam eql.
21 / 22
22. Elementos Intrínsecos de Programação Funcional Ordenamento Igualdade e Identidade Funções para listas
Exercícios
1. Escreva uma função que leia do usuário uma lista de produtos e seus respectivos
preços, colocando-os em uma lista organizada por pares produto-preço. A entrada
de dados é finalizada digitando-se a palavra ‘fim ao invés de um nome de produto.
Utilize o comando loop para implementar o laço de leitura e defina uma variável
global onde a lista ficará armazenada ao fim da leitura.
2. Escreva uma função ou conjunto de funções, que, através de um menu de opções,
realizem as seguintes tarefas: a) Pesquisar preço de um produto em lista de preços
e produtos. b) Mostrar em ordem alfabética toda a lista de produtos disponíveis
com os respectivos preços, formatada na tela. c) Fazer compras: Um ambiente
onde o usuário pode entrar com nomes de produtos e quantidades que deseja
comprar.
22 / 22