Você está na página 1de 30

LISP Uma Introduo

Claudio Esperana

Por qu LISP?

uma linguagem cujos rudimentos podem ser explicados em uma aula


Poucas construes permitem fazer muito

Permite ilustrar bem os princpios da recurso


No vamos usar comandos de repetio

Estruturas de dados complexas podem ser expressas de forma simples No d margem a encher de lingia
Uma funo freqentemente pode ser verificada visualmente

Recursos

Diversas implementaes grtis


Recomendo a implementao de Common Lisp do Dr Bruno Haible
Ver http://clisp.cons.org Distribuio binria para MS-Windows na pgina do curso http://www.lcg.ufrj.br/algoritmos

Diversos livros, alguns grtis


Recomendo The Little Lisper de Daniel P. Friedman e Matthias Felleisen, Mcmillan Publishing Company

Caractersticas do LISP

LISP = LISt Processing Inventada por McCarthy (1959) Implementa o Clculo Lambda de Church
Teoria de funes recursivas Linguagem funcional

Muito usada em Inteligncia Artificial

Caractersticas do LISP

Manipulao de informao simblica Verso inicial do Lisp era pouco prtica (sem iterao) Muitas verses e dialetos: Franz, Mac, Inter, Common (praticamente o padro) e Scheme (variante enxuta)

Diferenas entre LISP e outras linguagens Programas e Dados tm a mesma forma


trivial escrever um programa que escreve um programa

No se trabalha com variveis armazenadas (embora LISP suporte variveis)


Em C++ podemos implementar uma funo para inserir um elemento X numa varivel L do tipo lista Em LISP, escreve-se uma funo que, dados um elemento X e uma lista L, retorna uma lista igual a L com X inserido

Usando LISP

LISP freqentemente implementada por um interpretador


Usurio entra com uma expresso Interpretador avalia expresso e imprime o resultado

Exemplo:
> (+ 3 4 5 6) 18 > (+ (+ 3 4) (+ (+ 4 5) 6)) 22

Usando o intepretador CLISP


Ajuda: a qualquer momento durante a interao digite help 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) No nosso curso, no necessrio realmente aprender a usar o depurador, por isso, digite quit para voltar ao modo de interao normal Para sair do programa, digite (bye)

Exemplo de sesso com o CLISP

tomos

So os elementos mais simples da linguagem Podem ser


Smbolos

a b c xxx x1 x-1

Constantes
Nmeros: 1 2 1.33 -2.95 Cadeias: abc de x y z

Um smbolo pode ser associado a um valor


Conceito semelhante ao de varivel em linguagens imperativas

NIL e T

Os smbolos nil e t so especiais pois seus valores so eles prprios Quando o LISP est interpretando uma expresso 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

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

Avaliando Smbolos

O interpretador sempre tenta avaliar smbolos a menos que sejam precedidos por um apstrofe (quote)
>b *** - EVAL: variable B has no value > 'b B > nil nil >t t

Avaliando Listas

Assim como os smbolos, quando uma lista apresentada ao interpretador, esta entendida como uma funo e avaliada a menos que seja precedida por um apstrofe
> (+ 1 2) 3 > '(+ 1 2) (+ 1 2) > (a b c) *** - EVAL: the function A is undefined

Listas

Em LISP, se algo no um tomo, ento uma lista Uma lista uma seqncia de tomos ou listas entre parnteses. Por exemplo:
(a b c) (d (e f) g) ; Lista com 3 elementos ; Lista com 3 elementos

Observe que os elementos das listas tm que estar separados por um ou mais espaos em branco Observe tambm que ponto-e-vrgula denota o incio de um comentrio em LISP

Funes

O primeiro elemento de uma lista pode portanto denotar o nome de uma funo
Nesse caso, os demais elementos so os argumentos da funo

Muitas funes so pr-definidas em LISP As seguintes so as que usaremos mais:


Aritmtica: + - / * Relacionais: > = < >= <= Lgicas: and or not Manipulao de listas: cons car cdr Condicionais: if cond

Definindo Funes

A forma especial defun usada para definir uma funo


(defun nome lista-de-argumentos expresso) Define uma funo chamada nome que avalia expresso substituindo os smbolos da lista-de-argumentos pelos valores passados quando a funo for invocada

Exemplo
> (defun test (a b) (* 2 (+ a b))) TEST > (test 3 4) 14

Examinando Listas

(car lista) retorna o primeiro elemento de lista (cdr lista) retorna a lista sem o seu primeiro elemento
Um sinnimo de car first CAR = Contents of Address Register

Uma lista vazia () tambm pode ser escrita como nil


nil tanto um tomo como uma lista!

Um sinnimo de cdr rest CDR= Contents of Decrement Register

Examinando Listas - Exemplo


> (car '(a b)) A > (cdr '(a b)) (B) > (car (cdr '(a b))) B > (cdr (cdr '(a b))) NIL

Cons- truindo Listas

(cons elem lista) retorna uma cpia de lista com elem inserido como seu primeiro elemento Exemplo:
> (cons 'a '(b c)) (A B C) > (cons 'a '(b)) (A B) > (cons 'a nil) (A)

Teorema: (cons (car L) (cdr L)) = L

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? Resposta:


O ponto sempre existe num cons, mas nem sempre impresso Para entender, precisamos rever um conceito anterior ...

Conses (S-Expressions)

Em LISP, se algo no um tomo, ento 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 A regra do ponto:
O cons escrito com o valor dos dois campos entre parnteses ou separados por um ponto Entretanto, se o campo cdr nil ou um cons, o ponto pode ser omitido

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)

Conses e Listas

Podemos ver ento que listas so conses que nunca so escritos com pontos
Muitos autores preferem ignorar conses que no so listas

Afinal, o que ento uma lista? Eis uma resposta formal:


Axioma: nil uma lista Teorema: Se L uma lista, e elem um tomo ou uma lista, ento (cons elem L) uma lista

Cond -icionais

A forma especial cond permite escrever funes que envolvem decises Forma geral:
(cond (bool1 expr1) (bool2 expr2) ... (boolN exprN)

Funcionamento:

As expresses lgicas so avaliadas sucessivamente Se boolI verdadeira ento o cond avalia e retorna exprI Se nenhuma expresso lgica for avaliada como verdadeira, o cond retorna nil

If then else

O cond pode ser usado como um if-then-else:


(cond (bool1 expr1) (bool2 expr2) (bool3 expr3) (t expr4)) equivalente seguinte construo if bool1 then expr1 else if bool2 then expr2 else if bool3 then expr3 else expr4

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

Expresses Lgicas

So montadas com o auxlio das funes que implementam os predicados relacionais e lgicos tradicionais
Predicados lgicos: and or not Predicados relacionais: > = < >= <=
Argumentos devem ser nmeros Para comparar smbolos usa-se o predicado eq Para comparar conses estruturalmente usa-se o predicado equal

Expresses Lgicas - Exemplos


> (or (< 2 3) (> 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

Exerccios

Escreva as funes
(apaga L X)

(acresc L X Y)

Dada uma lista L e um elemento X , retorna L sem X. Se L no contm elem inicialmente, retorna uma cpia exata de L > (apaga (a b c d a) a) (b c d) Dada uma lista L, um elemento X e um elemento Y, retorna uma cpia 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)

Você também pode gostar