Paradigmas de Programação
Ronaldo F. Ramos
Instituto Federal do Ceará
11 de novembro de 2023
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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

03_lisp.pdf

  • 1.
    Paradigmas de Programação RonaldoF. Ramos Instituto Federal do Ceará 11 de novembro de 2023
  • 2.
    Elementos Intrínsecos deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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 deProgramaçã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