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

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

Lisp & Common Lisp Carlos Cunha Joabe Jesus {ceac,

Apresentações semelhantes


Apresentação em tema: "Lisp & Common Lisp Carlos Cunha Joabe Jesus {ceac,"— Transcrição da apresentação:

1 Lisp & Common Lisp Carlos Cunha Joabe Jesus {ceac,

2 Roteiro  Motivação  Histórico  Common Lisp Linguagem  CLOS  Aplicações

3 Motivação  Poder de Abstração de Linguagens Funcionais  Relacionada ao projeto de pesquisa - Linguagem da implementação do núcleo do Z-EVES (provador de teoremas)

4 Histórico  Concebida por John McCarthy no MIT em 1959John McCarthy MIT  Influenciado pelo Cálculo Lambda de Alonzo ChurchCálculo LambdaAlonzo Church Manipulação formal de funções matemáticas  Acrônimo para List Processing

5 Histórico - Lisp e seus dialétos  Existiam vários dialetos: MacLisp Common Lisp Scheme...  Hoje LISP está padronizado e referenciado como COMMON LISP

6 O que é o Common Lisp?  Uma das implementações de Lisp  Um “SDK” de domínio público Interpretador Compilador para executáveis até 5 vezes mais rápidos Conjunto de funções padrões

7 Common Lisp - Modularidade  Lisp permite: O empacotamento (packaging) de programas em módulos Sistema de objetos, funções genéricas com a possibilidade de combinação de métodos Definição de Macros

8 Common Lisp Tipos de dados

9 Common Lisp - Tipos de dados  números, caracteres, strings, arrays, listas, símbolos, estruturas, streams,...  Todos com tamanho ilimitado (a precisão e o tamanho de uma variável não necessita de ser declarado, o tamanho de listas e arrays altera-se dinamicamente)  Integers de precisão arbitrária, precisão de ponto flutuante ilimitada

10 Common Lisp - “API”  Funções genéricas: 88 funções aritméticas para todos os tipos de número (integers, ratios, floating point numbers, complex numbers) 44 funções de busca/filtro/ordenação para listas, arrays e strings

11 Common Lisp - Características  Tipagem em tempo de execução O programador geralmente não precisa se preocupar com declarações de tipo, mas ele recebe mensagens de erro caso haja violações de tipo (operações ilegais)  Gerenciamento automático de memória (garbage collection)

12 Common Lisp - Tipos de Dados  Booleano LISP utiliza t e nil para representar verdadeiro e falso Lisp tem funções booleanas-padrão, como and, or e not. Sendo os conetivos and e or são curto-circuitantes

13 Common Lisp - Tipos de Dados  Símbolos Um símbolo é somente um string de caracteres a b c1 foo bar Qualquer símbolo cujo nome inicia com dois pontos (:_) é uma palavra-chave

14 Exemplo - Símbolos  Ex: > (setq a 5) ; store a number as the value of a symbol 5 > a ; take the value of a symbol 5 > (let ((a 6)) a) ;bind the value of a symbol temporarily to 6 6 > a ; the value returns to 5 once the let is finished 5 > (+ a 6) ; use the value of a symbol as an argument 11 > b ; try to take the value of a symbol which has no value Error: Attempt to take the value of the unbound symbol b.

15 Common Lisp - Tipos de Dados  Números Um inteiro é um string de dígitos opcionalmente precedido de um + ou -. Um real parece com um inteiro, só que possui um ponto decimal e pode opcionalmente ser escrito em notação científica. Um racional se parece com dois inteiros com um / entre eles. LISP suporta números complexos que são escritos como: #c(r i)

16 Common Lisp - Tipos de Dados  Conses – Associações Produto Cartesiano -> Dupla Os campos são chamados de "car" e "cdr", ao invés de first e second > (cons 4 5) ; Aloca uma dupla, car = 4 e cdr = 5 (4. 5) > (car (cons 4 5)) 4 > (cdr (cons 4 5)) 5

17 Common Lisp - Tipos de Dados  Listas (encadeadas) Construídas a partir de conses  O car de cada cons aponta para um dos elementos da lista e  O cdr aponta ou para outro cons ou para nil. Ex: > (list 4 5 6) (4 5 6) OBS: LISP imprime listas de uma forma especial, omitindo os pontos e parênteses internos dos conses

18 Common Lisp - Tipos de Dados  Listas (encadeadas) nil corresponde à lista vazia  O car e cdr de nil são definidos como nil.  O car de um átomo é o próprio átomo.  O cdr de um átomo é nil. Se o cdr de um cons é nil, Lisp não se preocupa em imprimir o ponto ou o nil Se o cdr de cons A é cons B, então lisp não se preocupa em imprimir o ponto para A nem o parênteses para B

19 Common Lisp - Tipos de Dados  Listas (encadeadas) e Conses Ex: > (cons 4 nil) (4) > (cons 4 (cons 5 6)) (4 5. 6) > (cons 4 (cons 5 (cons 6 nil))) (4 5 6)

20 Common Lisp - Tipos de Dados  Ordenação de Listas LISP provê duas primitivas para ordenação: sort e stable-sort. O primeiro argumento para sort é uma lista, o segundo é a função de comparação. Ex: > (sort '( ) #'<) ( ) > (sort '( ) #'>) ( )  OBS: A função de comparação não garante estabilidade: se há dois elementos a e b tais que (and (not (< a b)) (not (< b a))), sort vai arranjá-los de qualquer maneira

21 Common Lisp - Tipos de Dados  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

22 Common Lisp - Tipos de Dados  Funções de Lista Úteis > (append '(1 2 3) '(4 5 6)) ;concatena listas ( ) > (reverse '(1 2 3)) ;reverte os elementos (3 2 1) > (member 'a '(b d a c)) ;pertinência a conjunto ;retorna primeira cauda cujo car é o elemento desejado (A C) > (find 'a '(b d a c)) ;outro set membership A > (find '(a b) '((a d) (a d e) (a b d e) ()) :test #'subsetp) (A B D E) ;find é mais flexível

23 Common Lisp - Tipos de Dados  Funções de Lista Úteis > (subsetp '(a b) '(a d e)) ;set containment NIL > (intersection '(a b c) '(b)) ;set intersection (B) > (union '(a) '(b)) ;set union (A B) > (set-difference '(a b) '(a)) ;diferença de conjuntos (B)

24 Common Lisp Igualdade

25 Common Lisp - Igualdade  LISP tem muitos conceitos diferentes de igualdade. Igualdade numérica é denotada por =  Como em Smalltalk ou em Prolog, existem os conceitos de identidade (mesmo objeto) e igualdade (objetos distintos, porém iguais)

26 Common Lisp - Igualdade  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) > (eq 'a 'a) T > (eq 'a 'b) NIL > (= 3 4) T > (eq '(a b c) '(a b c)) NIL > (equal '(a b c) '(a b c)) T > (eql 'a 'a) T > (eql 3 3) T

27 Common Lisp - Igualdade  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.

28 Common Lisp Funções

29 Common Lisp - Funções  Definindo uma função: > (defun foo (x y) (+ x y 5)) FOO > (foo 5 0) ;chamando a função 10 > (defun HELLO-WORLD () (print (list 'HELLO 'WORLD))) HELLO WORLD

30 Common Lisp - Funções  Funcall, Apply, e Mapcar São funções que pedem como argumento uma função: > (funcall #'+ 3 4) 7 > (apply #'+ 3 4 '(3 4)) 14 > (mapcar #'not '(t nil t nil t nil)) (NIL T NIL T NIL T)

31 Common Lisp - Funções  Funcall chama seu primeiro argumento com os argumentos restantes como argumentos deste.  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.  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 resulatdos em uma outra lista.

32 Utilidade de Funcall, apply e Mapcar  Funcall e apply são principalmente úteis quando o seu primeiro argumento é uma variável. Por exemplo, uma máquina de inferência poderia tomar uma função heurística e utilizar funcall ou apply para chamar esta função sobre uma descrição de um estado.  As funções de ordenação de listas utilizam funcall para chamar as suas funções de comparação  Mapcar, juntamente com funções sem nome (lambda) pode substituir muitos laços

33 Common Lisp - Funções Lambda  É uma função temporária e não nomeada > #'(lambda (x) (+ x 3)) (LAMBDA (X) (+ X 3)) > (funcall * 5) 8

34 Common Lisp - Funções Lambda  O poder de Lambda Ex: > (do ((x '( ) (cdr x)) (y nil)) ((null x) (reverse y)) (push (+ (car x) 2) y) ) ( ) > (mapcar #'(lambda (x) (+ x 2)) '( )) ( )

35 Common Lisp Forms

36 Common Lisp - Forms  Forms e o Laço Top-Level Um Form é qualquer trecho digitado pelo usuário para o interpretador read-eval-print loop Lisp salva os três últimos resultados de forms previamente digitados. Ele os armazena sob os símbolos *, ** e ***.

37 Common Lisp - Forms  Forms e o Laço Top-Level Em geral, um form é ou um átomo (p.ex.: um símbolo, um inteiro ou um string) ou uma lista. Se o form for um átomo, LISP o avalia imediatamente. Símbolos avaliam para seu valor, inteiros e strings avaliam para si mesmos. Se o form for uma lista, LISP trata o seu primeiro elemento como o nome da função, avaliando os elementos restantes de forma recursiva. Então chama a função com com os valores dos elementos restantes como argumentos.

38 Common Lisp - Forms especiais  quote ‘ e function parecem chamadas a funções mas não são! Ex. quote: > (setq a 3) 3 > a 3 > (quote a) A > 'a ; 'a is an abbreviation for (quote a) A

39 Common Lisp  Forms especiais Ex. function: > (setq + 3) 3 > + 3 > '+ + > (function +) # > #'+ ; #'+ is an abbreviation for (function +) #

40 Common Lisp Binding

41 Common Lisp - Binding  Binding é uma atribuição escopada lexicamente  Forms especiais let e let*: (let ((var1 val1) (var2 val2)... ) body )  Let “atribui” val1 a var1,..., e então executa os comandos de seu corpo  Let* permite que sejam referenciadas variáveis definidas anteriormente

42 Common Lisp - Dynamic Scoping  No escopo dinâmico se você atribui um valor a uma variável, TODA menção desta variável vai retornar aquele valor até que você atribua outro valor à mesma variável  Usa o form defvar

43 Common Lisp - Dynamic Scoping  Ex: > (defvar *special* 5) *SPECIAL* > (defun check-special () *special*) CHECK-SPECIAL > (check-special) 5 > (let ((*special* 6)) (check-special)) 6

44 Common Lisp Fluxo de controle

45 Common Lisp - Fluxo de controle  Execução seqüencial em Lisp O form progn permite blocos de comandos em seu corpo, que são executados sequencialmente e retornando o valor do último Permite também declaração explícita de variáveis locais, além de retorno explícito

46 Common Lisp - Fluxo de controle  Ex: (defun F2.17a nil (prog (i j) ;define i e j como variáveis locais inic. com nil (setq i (read)) (setq j (read) (return (print (- i j))) )

47 Common Lisp - Condicionais  Lisp possui um função para representar condicionais: > (if t 5 6) 5 > (if nil 5 6) 6 > (if 4 5 6) 5  OBS: nil significa falso e qualquer outra coisa verdadeiro.

48 Common Lisp - Condicionais  If’s sem then ou sem else podem ser escritos utilizando-se when ou unless, respectivamente: > (when t 3) 3 > (when nil 3) NIL > (unless t 3) NIL > (unless nil 3) 3

49 Common Lisp - Condicionais  Else If’s são descritos usando o form cond: Um cond consiste de símbolo con seguido por um número de cláusulas- cond, cada qual é uma lista. O primeiro elemento de uma cláusula-cond é a condição, os lementos restantes são a ação.

50 Common Lisp - Condicionais  Ex: > (setq a 3) 3 > (cond ((evenp a) a) ; if a is even return a ((> a 7) (/ a 2)) ; else if a > 7 return a/2 ((< a 5) (- a 1)) ; else if a < 5 return a-1 (t 17) ; else return 17 ) 2 OBS: Se não há nenhuma ação na cláusula cond selecionada, cond retorna o valor verdadeiro

51 Common Lisp - Condicionais  Form case Ex: > (setq x 'b) B > (case x (a 5) ((d e) 7) ((b f) 3) (otherwise 9) ) 3

52 Common Lisp - Iteração  Lisp permite a utilização da função loop: > (setq a 4) 4 > (loop (setq a (+ a 1)) (when (> a 7) (return a)) ) 8 > (loop (setq a (- a 1)) (when (< a 3) (return)) ) NIL

53 Common Lisp - Iteração  dolist - ata uma variável aos elementos de uma lista na sua ordem e termina quando encontra o fim da lista: > (dolist (x '(a b c)) (print x)) A B C NIL

54 Common Lisp - Iteração  Iteração com do e do*: > (do ((x 1 (+ x 1)) ;variável x, com valor inicial 1 (y 1 (* y 2)) ; variável y, com valor inicial 1 ) ((> x 5) y) ;retorna valor de y quando x > 5 (print y) ; corpo (print 'working) ; corpo ) 1 WORKING 2 WORKING 4 WORKING 8 WORKING 16 WORKING 32

55 Common Lisp - Sáidas Não-Locais  O form especial return na seção de iteração é um exemplo de um return não-local. Outro exemplo é o form return-from, o qual retorna um valor da função que o envolve: > (defun foo (x) (return-from foo 3) x ) FOO > (foo 17) 3

56 Common Lisp - Blocos nomeados  Ex: > (block foo (return-from foo 7) 3 ) 7

57 Common Lisp - Gerando Erros  Ex: > (error "This is an error") Error: This is an error

58 Common Lisp - Extensões Dados Avançados

59 Common Lisp - Dados Avançados  Estruturas: análogas a structs em "C" ou records em PASCAL O exemplo abaixo define um tipo de dado chamado FOO contendo 2 campos: > (defstruct foo bar quux ) FOO Define também 3 funções que operam neste tipo de dado:  make-foo, foo-bar e foo-quux

60 Common Lisp - Dados Avançados  Estruturas: make-foo - cria um novo objeto FOO. As outras acessam os campos de um objeto do tipo FOO > (make-foo) #s(FOO :BAR NIL :QUUX NIL) > (make-foo :baa 3) #s(FOO :BAR 3 :QUUX NIL) > (foo-bar *) 3 > (foo-quux **) NIL

61 Common Lisp - “Atribuição”  O form especial setf usa seu primeiro argumento para definir um lugar na memória, avalia o seu segundo argumento e armazena o valor resultante na locação de memória resultante  Setf é a única maneira de se setar os valores de um array ou os campos de uma estrutura

62 Common Lisp - “Atribuição”  Ex: > (setf a (make-array 1)) ; setf on a variable is equivalent to setq #(NIL) > (push 5 (aref a 1)) ;push can act like setf (5) > (pop (aref a 1)) ; so can pop 5 > (setf (aref a 1) 5) 5 > (incf (aref a 1)) ; incf reads from a place, increments, and writes back 6 > (aref a 1) 6

63 Common Lisp A extensão CLOS

64 CLOS  Extensão do Common Lisp para Orientação a Objetos  Características: Herança múltipla Funções genéricas Meta-classe e meta-objeto Técnica de criação e iniciação de objetos que permite controle do processo por parte do usuário

65 Classes CLOS  Definida usando o form DEFCLASS  Ex: (DEFCLASS nodeDeClasse (nomeDeSuperclasse*) (slot*) opções* ) Se nomeDeSuperclasse* for vazio a superclasse padrão é STANDARD- OBJECT

66 Slots em CLOS  Um slot tem a forma: (nomeDoSlot slotOption*) As opções mais úteis são:  :ACCESSOR function-name  :INITFORM expression  :INITARG symbol

67 Exemplo DEFCLASS  Um DEFCLASS: (defclass person () ((name :accessor person-name :initform 'bill :initarg :name) (age :accessor person-age :initform 10 :initarg :age)) )

68 DEFCLASS  DEFSTRUCT  Sintaxe um pouco diferente  Considere o DEFSTRUCT: (defstruct person (name 'bill) (age 10) )

69 DEFCLASS  DEFSTRUCT  DEFSTRUCT definiria automaticamente campos com expressões para: computar valores iniciais default funções de acesso (get e set) como PERSON-NAME e uma função de inicialização (MAKE- PERSON) que pegaria argumentos com palavras-chave como abaixo: (make-person :name 'george :age 12)

70 DEFCLASS  DEFSTRUCT  DEFCLASS dá maior controle sobre quais coisas são chamadas, pois: Permite especificar quais funções auxiliares queremos, sendo mais flexível que o DEFSTRUCT

71 Objetos em CLOS  Instâncias são criadas através da função MAKE-INSTANCE Similar às funções MAKE-x definidas por DEFSTRUCT Permite que você passe a classe a ser instanciada como argumento EX: (MAKE-INSTANCE class {initarg value}*)

72 Objetos de Classe (“static”)  Uma classe, uma vez definida, também é um objeto  Para obter um objeto-classe a partir de seu nome, usa-se: (FIND-CLASS name)

73 Métodos em CLOS  Um DEFMETHOD (DEFMETHOD generic-function-name specialized-lambda-list form*)

74 Métodos em CLOS  Ex.: (defmethod test ((x number) (y number)) '(num num)) (defmethod test ((i integer) (y number)) '(int num)) (defmethod test ((x number) (j integer)) '(num int)) (test 1 1) => (int num), not (num int) (test 1 1/2) => (int num) (test 1/2 1) => (num int) (test 1/2 1/2) => (num num)

75 Combinação de Métodos  :before methods are all called before the primary method, with the most specific :before method called first  :after methods are all called after the primary method, with the most specific :after method called last.  :around methods run before the other methods. As with primary methods, only the most specific is called and call-next-method calls the next most specific

76 Combinação de Métodos - Ex. (defclass food () ()) (defmethod cook :before ((f food)) (print "A food is about to be cooked.")) (defmethod cook :after ((f food)) (print "A food has been cooked.")) (defclass pie (food) ((filling :accessor pie-filling :initarg :filling :initform 'apple))) (defmethod cook ((p pie)) (print "Cooking a pie.") (setf (pie-filling p) (list 'cooked (pie-filling p)))) (defmethod cook :before ((p pie)) (print "A pie is about to be cooked.")) (defmethod cook :after ((p pie)) (print "A pie has been cooked.")) (setq pie-1 (make-instance 'pie :filling 'apple))

77 Combinação de Métodos – Ex.  Saída > (cook pie-1) "A pie is about to be cooked." "A food is about to be cooked." "Cooking a pie.“ "A food has been cooked." "A pie has been cooked." (cooked apple)

78 Lisp & Common Lisp Aplicações

79  Utilizado para desenvolver o primeiro sistema computacional de matématica simbólica, o MACSYMA.MACSYMA  Linguagem de extensão do software do AutoCAD, desenvolvido pela AutoDesk; e do editor de textos Emacs AutoCADAutoDeskEmacs  Estudos de semântica formal das línguas naturais e de programação

80 Aplicações  Sistema de reserva de passagens Orbitz da ITA. Utilizado por diversas companhias aérias  A Simbolics criou um sistema de modelagem 3D, adquirido pela IZWare e renomeado para Mirai, que foi utilizado nos efeitos de Senhor dos AnéisSimbolicsMiraiSenhor dos Anéis  Sistema de e-commerce da viaweb (por Paul Graham) que posteriormente foi vendida para o Yahoo por US$ 40 milhões, na época da bolha da internete-commerceviawebPaul Graham Yahoobolha da internet

81 Referências  Introdução à Linguagem Lisp onal.html  Common Lisp  CLOS

82 Lisp & Common Lisp Dúvidas?


Carregar ppt "Lisp & Common Lisp Carlos Cunha Joabe Jesus {ceac,"

Apresentações semelhantes


Anúncios Google