A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos.

Apresentações semelhantes


Apresentação em tema: "LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos."— Transcrição da apresentação:

1 LISP – Uma Introdução Claudio Esperança

2 Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos podem ser explicados em uma aula –Poucas construções permitem fazer muito Permite ilustrar bem os princípios da recursão Permite ilustrar bem os princípios da recursão –Não vamos usar comandos de repetição Estruturas de dados complexas podem ser expressas de forma simples Estruturas de dados complexas podem ser expressas de forma simples Não dá margem a encher de lingüiça Não dá margem a encher de lingüiça –Uma função freqüentemente pode ser verificada visualmente

3 Recursos Diversas implementações grátis Diversas implementações grátis –Recomendo a implementação de Common Lisp do Dr Bruno Haible Ver Ver Distribuição binária para MS-Windows na página do curso Distribuição binária para MS-Windows na página do curso Diversos livros, alguns grátis Diversos livros, alguns grátis –Recomendo The Little Lisper de Daniel P. Friedman e Matthias Felleisen, Mcmillan Publishing Company

4 Características do LISP LISP = LISt Processing Inventada por McCarthy (1959) Implementa o Cálculo Lambda de Church – –Teoria de funções recursivas – –Linguagem funcional Muito usada em Inteligência Artificial

5 Características do LISP Manipulação de informação simbólica Versão inicial do Lisp era pouco prática (sem iteração) Muitas versões e dialetos: Franz, Mac, Inter, Common (praticamente o padrão) e Scheme (variante enxuta)

6 Diferenças entre LISP e outras linguagens Programas e Dados têm a mesma forma Programas e Dados têm a mesma forma –É trivial escrever um programa que escreve um programa Não se trabalha com variáveis armazenadas (embora LISP suporte variáveis) Não se trabalha com variáveis armazenadas (embora LISP suporte variáveis) –Em C++ podemos implementar uma função para inserir um elemento X numa variável L do tipo lista –Em LISP, escreve-se uma função que, dados um elemento X e uma lista L, retorna uma lista igual a L com X inserido

7 Usando LISP LISP é freqüentemente implementada por um interpretador LISP é freqüentemente implementada por um interpretador –Usuário entra com uma expressão –Interpretador avalia expressão e imprime o resultado Exemplo: Exemplo: > ( ) 18 > (+ (+ 3 4) (+ (+ 4 5) 6)) 22

8 Usando o intepretador CLISP Ajuda: a qualquer momento durante a interação digite help Ajuda: a qualquer momento durante a interação digite help O interpretador numera os comandos O interpretador numera os comandos Ao cometer um erro, o interpretador escreve uma mensagem de erro e entra num break loop, isto é, num depurador ( debugger ) Ao cometer um erro, o interpretador escreve uma mensagem de erro e entra num break loop, isto é, num depurador ( debugger ) No nosso curso, não é necessário realmente aprender a usar o depurador, por isso, digite quit para voltar ao modo de interação normal No nosso curso, não é necessário realmente aprender a usar o depurador, por isso, digite quit para voltar ao modo de interação normal Para sair do programa, digite (bye) Para sair do programa, digite (bye)

9 Exemplo de sessão com o CLISP

10 Átomos São os elementos mais simples da linguagem São os elementos mais simples da linguagem Podem ser Podem ser –Símbolos a b c xxx x1 x-1 a b c xxx x1 x-1 –Constantes Números: Números: Cadeias: abc de x y z Cadeias: abc de x y z Um símbolo pode ser associado a um valor Um símbolo pode ser associado a um valor –Conceito semelhante ao de variável em linguagens imperativas

11 NIL e T Os símbolos nil e t são especiais pois seus valores são eles próprios Os símbolos nil e t são especiais pois seus valores são eles próprios Quando o LISP está interpretando uma expressão booleana, o átomo nil é usado para denotar o valor falso Quando o LISP está interpretando uma expressão booleana, o átomo nil é usado para denotar o valor falso t denota o valor booleano verdadeiro, mas qualquer valor diferente de nil é entendido como verdadeiro t denota o valor booleano verdadeiro, mas qualquer valor diferente de nil é entendido como verdadeiro

12 NIL e T - Exemplo > ( (<= 2 3)T > (> 3 4) NIL > (and 2 t) T > (and 2 nil) NIL

13 Avaliando Símbolos O interpretador sempre tenta avaliar símbolos a menos que sejam precedidos por um apóstrofe ( quote ) O interpretador sempre tenta avaliar símbolos a menos que sejam precedidos por um apóstrofe ( quote ) > b *** - EVAL: variable B has no value > 'b B > nil nil > t t

14 Avaliando Listas Assim como os símbolos, quando uma lista é apresentada ao interpretador, esta é entendida como uma função e avaliada a menos que seja precedida por um apóstrofe Assim como os símbolos, quando uma lista é apresentada ao interpretador, esta é entendida como uma função e avaliada a menos que seja precedida por um apóstrofe > (+ 1 2) 3 > '(+ 1 2) (+ 1 2) > (a b c) *** - EVAL: the function A is undefined

15 Listas Em LISP, se algo não é um átomo, então é uma lista Em LISP, se algo não é um átomo, então é uma lista Uma lista é uma seqüência de átomos ou listas entre parênteses. Por exemplo: Uma lista é uma seqüência de átomos ou listas entre parênteses. Por exemplo: (a b c) ; Lista com 3 elementos (d (e f) g) ; Lista com 3 elementos Observe que os elementos das listas têm que estar separados por um ou mais espaços em branco Observe que os elementos das listas têm que estar separados por um ou mais espaços em branco Observe também que ponto-e-vírgula denota o início de um comentário em LISP Observe também que ponto-e-vírgula denota o início de um comentário em LISP

16 Funções O primeiro elemento de uma lista pode portanto denotar o nome de uma função O primeiro elemento de uma lista pode portanto denotar o nome de uma função –Nesse caso, os demais elementos são os argumentos da função Muitas funções são pré-definidas em LISP Muitas funções são pré-definidas em LISP As seguintes são as que usaremos mais: As seguintes são as que usaremos mais: –Aritmética: + - / * –Relacionais: > = = = = <= –Lógicas: and or not –Manipulação de listas: cons car cdr –Condicionais: if cond

17 Definindo Funções A forma especial defun é usada para definir uma função A forma especial defun é usada para definir uma função (defun nome lista-de-argumentos expressão) –Define uma função chamada nome que avalia expressão substituindo os símbolos da l ista-de-argumentos pelos valores passados quando a função for invocada Exemplo Exemplo > (defun test (a b) (* 2 (+ a b))) TEST > (test 3 4) 14

18 Examinando Listas (car lista) retorna o primeiro elemento de lista (car lista) retorna o primeiro elemento de lista –Um sinônimo de car é first –CAR = Contents of Address Register (cdr lista) retorna a lista sem o seu primeiro elemento (cdr lista) retorna a lista sem o seu primeiro elemento –Um sinônimo de cdr é rest –CDR = Contents of Decrement Register Uma lista vazia () também pode ser escrita como nil Uma lista vazia () também pode ser escrita como nil –nil é tanto um átomo como uma lista!

19 Examinando Listas - Exemplo > (car '(a b)) A > (cdr '(a b)) (B) > (car (cdr '(a b))) B > (cdr (cdr '(a b))) NIL

20 Cons- truindo Listas (cons elem lista) retorna uma cópia de lista com elem inserido como seu primeiro elemento (cons elem lista) retorna uma cópia de lista com elem inserido como seu primeiro elemento Exemplo: Exemplo: > (cons 'a '(b c)) (A B C) > (cons 'a '(b)) (A B) > (cons 'a nil) (A) Teorema: (cons (car L) (cdr L)) = L Teorema: (cons (car L) (cdr L)) = L

21 Cons O que acontece se passarmos um átomo como segundo argumento de cons ? O que acontece se passarmos um átomo como segundo argumento de cons ? > (cons 'a 'b) (A. B) De onde veio o ponto entre A e B? De onde veio o ponto entre A e B? Resposta: Resposta: –O ponto sempre existe num cons, mas nem sempre é impresso –Para entender, precisamos rever um conceito anterior...

22 Conses (S-Expressions) Em LISP, se algo não é um átomo, então é um cons ou S-expression Em LISP, se algo não é um átomo, então é um cons ou S-expression Um cons nada mais é que um registro com dois campos, o primeiro é chamado de car e o segundo de cdr Um cons nada mais é que um registro com dois campos, o primeiro é chamado de car e o segundo de cdr A regra do ponto: A regra do ponto: –O cons é escrito com o valor dos dois campos entre parênteses ou separados por um ponto – Entretanto, se o campo cdr é nil ou um cons, o ponto pode ser omitido

23 Conses – Exemplos > (cons 'a 'b) (A. B) > '(a. b) (A. B) > '(a. nil) (A) > '(a. (b. (c. nil))) (A B C) > '(a. (b. c)) (A B. C) > '((a. b). c) ((A. B). C) > '((a. b). (b. c)) ((A. B) B. C)

24 Conses e Listas Podemos ver então que listas são conses que nunca são escritos com pontos Podemos ver então que listas são conses que nunca são escritos com pontos –Muitos autores preferem ignorar conses que não são listas Afinal, o que é então uma lista? Afinal, o que é então uma lista? Eis uma resposta formal: Eis uma resposta formal: –Axioma: nil é uma lista –Teorema: Se L é uma lista, e elem é um átomo ou uma lista, então (cons elem L) é uma lista

25 Cond -icionais A forma especial cond permite escrever funções que envolvem decisões A forma especial cond permite escrever funções que envolvem decisões Forma geral: Forma geral: (cond (bool1 expr1) (bool2 expr2) (bool2 expr2) (boolN exprN) (boolN exprN)) Funcionamento: Funcionamento: –As expressões lógicas são avaliadas sucessivamente –Se boolI é verdadeira então o cond avalia e retorna exprI –Se nenhuma expressão lógica for avaliada como verdadeira, o cond retorna nil

26 If – then – else O cond pode ser usado como um if-then-else: O cond pode ser usado como um if-then-else: (cond (bool1 expr1) (bool2 expr2) (bool2 expr2) (bool3 expr3) (bool3 expr3) (t expr4)) (t expr4)) –É equivalente à seguinte construção if bool1 then expr1 else if bool2 then expr2 else if bool3 then expr3 else expr4

27 Exemplo > (cond ((= 1 2) 'a) ((> 2 3) 'b) ((> 2 3) 'b) ((< 3 4) 'c) ((< 3 4) 'c))C > (defun f (lista elem) (cond ((eq lista nil) nil) (cond ((eq lista nil) nil) ((eq (car lista) elem) t) ((eq (car lista) elem) t) (t (f (cdr lista) elem)) (t (f (cdr lista) elem)) ))F > (f '(a b c) 'c) T > (f '(a b c) 'd) NIL

28 Expressões Lógicas São montadas com o auxílio das funções que implementam os predicados relacionais e lógicos tradicionais São montadas com o auxílio das funções que implementam os predicados relacionais e lógicos tradicionais –Predicados lógicos: and or not –Predicados relacionais: > = = = = <= Argumentos devem ser números Argumentos devem ser números Para comparar símbolos usa-se o predicado eq Para comparar símbolos usa-se o predicado eq Para comparar conses estruturalmente usa-se o predicado equal Para comparar conses estruturalmente usa-se o predicado equal

29 Expressões Lógicas - Exemplos > (or ( 2 3)) T > (= 'a 'b) *** - argument to = should be a number: A > (eq 'a 'b) NIL > (eq 'a 'a) T > (eq '(a b) '(a b)) NIL > (equal '(a b) '(a b)) T

30 Exercícios Escreva as funções Escreva as funções –(apaga L X) Dada uma lista L e um elemento X, retorna L sem X. Se L não contém elem inicialmente, retorna uma cópia exata de L Dada uma lista L e um elemento X, retorna L sem X. Se L não contém elem inicialmente, retorna uma cópia exata de L > (apaga (a b c d a) a) (b c d) –(acresc L X Y) Dada uma lista L, um elemento X e um elemento Y, retorna uma cópia de L onde um Y é inserido depois de cada X Dada uma lista L, um elemento X e um elemento Y, retorna uma cópia de L onde um Y é inserido depois de cada X > (acresc (a b c d a) a k) (a k b c d a k)


Carregar ppt "LISP – Uma Introdução Claudio Esperança. Por quê LISP? É uma linguagem cujos rudimentos podem ser explicados em uma aula É uma linguagem cujos rudimentos."

Apresentações semelhantes


Anúncios Google