PLP 2010/1
Profa. Heloisa
1/2010 1 1/2010 2
LISP
• Programa Funcional (puro): • LISt Processing
– definições de funções
– chamada de funções
• Linguagem de Programação Funcional
• Versões mais atuais:
– introduziram características imperativas • LISP Original – proposto por John MacCarthy e
– estenderam o conceito de função para um grupo em 1960 no Massachussets Institute
procedimento of technology (MIT). Lisp puro, completamente
funcional.
• Linguagens Funcionais:LISP, SCHEME,
HOPE, ....
1/2010 3 1/2010 4
Conceitos Básicos
• Características: • Função: regra que associa elementos de um
conjunto (domínio) com elementos de outro
conjunto (codomínio).
– linguagem funcional
– linguagem simbólica
• Definição de Função: especifica o domínio,
– linguagem interpretada
codomínio e a regra de associação para a
– linguagem declarativa e procedural função
• Aplicação de Função: quando uma função • Forma Funcional: método de combinar funções
é aplicada a um elemento do domínio para obter outra função como resultado.
fornece um resultado do codomínio. Na
Ex: Composição de funções
aplicação, um argumento substitui o
parâmetro.
F = G°H F(x) = G(H(x))
1/2010 7 1/2010 8
Tipos de Dados (objetos) do LISP
• Átomos – elementos indivisíveis: • Listas – série de átomos ou listas separadas por
A, F68, 27 espaços e delimitadas por parêntesis:
(1 2 3 4)
– Números (Átomos numéricos) – (MARIA)
átomos só com números: 27, 3.14, -5. (JOAO MARIA)
() Lista vazia, também denotada por NIL
((v-1 valor-1) (v-2 valor-2) (v-3 valor-3))
– Símbolos (Átomos Simbólicos) –
átomos que não são números: A NOME, X1
1/2010 9 1/2010 10
S-Expressões
A mesma sintaxe representa tanto dados quanto
programas:
Átomos Listas (a b c)
Números Símbolos (* 7 9)
1/2010 13 1/2010 14
Avaliação de listas
• A notação (f x y) equivale a notação de função matemática • Regra de avaliação de expressões:
f(x,y)
• O avaliador LISP quando recebe uma lista tenta interpretar o – Avalia primeiro os argumentos
primeiro elemento da lista como o nome de uma função e e os – Aplica a função indicada pelo primeiro elemento da
restantes como seus argumentos expressão
– Se os argumentos forem expressões funcionais, aplica a
• Se o primeiro elemento da lista não for uma função definida regra recursivamente
ocorre um erro
> (a b c) • Exemplos:
Error: invalid function: a >(* (+ 2 5) (- 7 (/ 21 7)))
28
• Forma geral:
(f a1 a2 a3 ....an) >(= (+ 2 3) 5)
t
1/2010 15 1/2010 16
Convenções nas regras para avaliar Dados “versus” funções
expressões
• Por default, tudo é avaliado
• Para que a lista represente dados é necessário impedir sua
avaliação pelo interpretador LISP
• Números são avaliados como eles mesmos
• Para isso é usada uma função especial de nome quote, que
também pode ser representada por aspas simples antes da
expressão.
• Símbolos como x podem ter um valor ligado. Se
tiver, esse valor é retornado • Quote recebe um argumento e retorna esse argumento sem
avaliar.
1/2010 17 1/2010 18
1/2010 19 1/2010 20
• nth – recebe como argumentos um número e uma • Length – retorna o número de elementos de uma lista
lista e retorna o elemento da lista na posição
indicada pelo número, começando a partir do zero > (length ´(a b c d))
4
> (length ´(1 2 (3 4) 5 6))
> (nth 2 ´(a b c d)) 5
c
• Member – recebe como argumento uma expressão e uma lista
> (nth 1 (list 1 2 3 4 5)) e verifica se a expressão é membro da lista
2
> (member 5 ´(1 2 3 4 5))
> (nth 2 ´((a 1) (b 2) (c 3) (d 4))) t
>(member ´a ´(1 2 3 4 5))
(c 3)
nil
1/2010 21 1/2010 22
1/2010 23 1/2010 24
Composição de CAR e CDR Exemplo
> (CAR (CDR ‘(A B C)))
B (CAR (CAR (CDR (CDR ‘(HOJE E (DIA DE) AULA)))))
1/2010 29 1/2010 30
1/2010 31 1/2010 32
Criar novas funções
Um Símbolo com valor pode aparecer como argumento de • A programação em Lisp consiste em definir novas funções a
um procedimento. partir de funções conhecidas
> (SETQ L ‘(A B)) • Depois de definidas, as funções podem ser usadas da mesma
(A B) forma que as funções embutidas na linguagem
1/2010 33 1/2010 34
Chamada de funções
> (defun quadrado (x) • A função definida por defun deve ser chamada com o mesmo
(* x x)) número de argumentos (parâmetros reais) especificados na
quadrado definição
• Defun retorna como resultado o nome da função • Os parâmetros reais são ligados aos parâmetros formais
1/2010 37 1/2010 38
Predicados
• Um predicado é uma função que retorna T (verdadeiro) ou Nil • LISTP – verifica se seu argumento é uma lista
(falso)
• T e NIL são átomos especiais com valores pré-definido
> (listp ´(a b c))
• ATOM – verifica se seu argumento é um átomo T
> (atom 5) > (setq L ´(a b c))
T (a b c)
> (atom ´L) > (listp L)
T
> (setq L ´(a b c))
T
(a b c) > (listp ´L)
> (atom L) nil
Nil
1/2010 39 1/2010 40
• Equal – recebe dois argumentos e retorna T se eles são
iguais e NIL se não são. • Null – verifica se seu argumento é uma lista vazia
1/2010 41 1/2010 42
1/2010 43 1/2010 44
Controle de fluxo em Lisp
• ZEROP – argumento deve ser número. Verifica se é zero • Os desvios em Lisp também são baseados em
avaliações de funções, com o auxílio dos
> (setq zero 0) predicados
0
> (zerop zero)
• Função cond – implementa desvio condicional
T
• MINUSP – argumento deve ser número. Verifica se é negativo • Argumentos: pares do tipo condição-ação (qualquer
número)
> (setq N -5)
-5 (cond (<condição1> <ação1>)
> (minusp N) (<condição1> <ação1>)
T
....
(<condição1> <ação1>))
1/2010 45 1/2010 46
• Cond não avalia todos os argumentos • Vamos redefinir essa função para ilustrar o uso de cond
• Avalia as condições até que uma retorne valor diferente de nil > (defun valor-absoluto (x)
(cond ((< x 0) (-x))
• Quando isso acontece, avalia a expressão associada à ((>= x 0) x)))
condição e retorna esse resultado como valor da expressão
cond valor-absoluto
• Nenhuma das outras condições ou ações são avaliadas > (valor-absoluto -5)
5
• Se todas as condições são avaliadas como nil, cond retorna nil
1/2010 47 1/2010 48
Ação default Valores nil e “não nil”
• Definição alternativa para valor-absoluto:
• Os predicados em Lisp são definidos de forma que qualquer
expressão diferente de NIL é considerada verdadeira
> (defun valor-absoluto (x)
(cond ((< x 0) (-x)) • Member – recebe dois argumentos, o segundo deve ser lista
(t x)))
• Se o primeiro for membro do segundo retorna o sufixo do
• Nessa versão, a última condição (>= x 0) é substituída por t, segundo argumento que tem o primeiro argumento como
pois é sempre verdadeira se a primeira for falsa elemento inicial
• Quando existem mais de dois pares de condição-ação, o uso > (member 3 ´(1 2 3 4 5))
de t na última condição serve par forçar a execução de alguma (3 4 5)
ação, quando todas as outras são falsas (valor nil)
> (member 6 ´(1 2 3 4 5))
nil
1/2010 49 1/2010 50