LISP - Introdução Linguagem de alto nível, criada por John McCarty em 1959, tendo em vista facilitar a programação de sistemas de raciocínio baseados em lógica Foi adoptada como linguagem principal em investigação em IA (1956). É uma das linguagens de alto nível com menos restrições de sintaxe O LISP foi originalmente desenhado para ser uma linguagem interpretada: Interface: Editor Interpretador Desenvolvimento de programas de forma incremental mais simples teste modular Desenvolvimento bottom-up Actualmente o código em LISP pode ser compilado Maior velocidade de execução Existem vários dialectos de LISP: COMMON LISP (o mais sofisticado e mais utilizado) Outros: MAC LISP, INTERLISP, XLISP É uma linguagem para manipulação de símbolos LISP é o acrónimo para LISt Processor Os programas podem ser tratados como dados Conceitos fundamentais: Símbolos (atoms) Listas Recursão Abstração Links interessantes: (sobre a linguagem, aplicações e software, bibliografia) www.lisp.org www.cons.org Implementações de Common Lisp gratuitas: clisp, allegro CL (versão reduzida).
Introdução: Interpretador CLISP Allegro Common Lisp Saír do LISP: (exit) :quit :exit Ajuda sobre comandos: :h :help Reset do interpretador :reset Interpretador: read-eval-print loop: >(+ 1 3 4) 10 >
Tipos Básicos de Informação Atomos e Listas ATOMOS a () Ana LISTAS 34 (a john 34 c3po) Átomos (expressões atómicas): >10 10 Sequências de caracteres Podem ser: números, caracteres e strings ou símbolos números, caracteres e strings: quando introduzidos, o resultado da avaliação é o próprio valor introduzido Números > 3.14 3.14 Caracteres: objectos começados por #\ >#\a #\a > 5/6 5/6 > #c(3 4) #c(3 4) >(+ #c( 3) 4) #c( 6 3) >#\A #\A (a) >5.0/6 Error: Attempt to take the value of the unbound variable `5.0/6'. [condition type: UNBOUND- VARIABLE] >#\newline #\newline Strings: delimitados por aspas > "Esta frase tem duas linhas "Esta frase tem duas linhas" > "hhgh\jjk3#vg" "hhghjjk3#vg" Não confundir #\A com a string A ou com o símbolo A
Tipos Básicos de Informação: Atomos / Símbolos Símbolos Print name Value Binding Property List Function binding Se não existir outra regra, o LISP avalia um símbolo devolvendo o seu valor > pi 3.14159653589793d0 > a Error: Attempt to take the value of the unbound variable `A'. [condition type: UNBOUND-VARIABLE] > (setq a 38) 38 > a 38 > (defun a (k) (princ k)) A >a 38 >(a 89) 89 89 > (setq alfabeto '(a b c d e f g h i j k l m n o p q r s t u v w x y z)) (A B C D E F G H I J...) >(setq alfabeto_s "abcdefghijklmnopqrstuvwxyz") "abcdefghijklmnopqrstuvwxyz" >9 9 >10 10 >my-age 10 >t T >nil NIL >() NIL NIL: é simultaneamente um átomo e uma lista
Tipos Básicos de Informação: Listas Lista: sequência de objectos (números, caracteres, strings, símbolos, listas, etc) separados por espaços em branco e delimitados por parentesis curvos Tem dois objectivos principais: armazena informação e chama funções definidas Pode ter um numero ilimitado de elementos e uma profundidade tão elevada quanto se queira Lista sem elementos (lista vazia): NIL ou () O lisp trata as listas como contendo o nome de uma função seguido dos argumentos (notação prefixa): (name-of-function first-argument second-argument...) >(+ 13 45) 60 >(setq my-age 9) 9 >(+ my-age (* my-age )) 7 >(- 6 4 9-1) -6 Algumas funções primitivas +, -, *, /, exp, expt, log, sqrt, sin, cos, tan, max, min. >(expt 3) 8
Avaliação de listas > (+ (/ 4 ) (* 4)) 10 Codigo / Codigo * 4 Codigo / 4 Codigo / Codigo * 4 Codigo * 8 Após a avaliação dos elementos da ista, o LISP aplica o function binding (codigo) do primeiro elemento da lista ao resultado da avaliação dos restantes elementos
Construtores de listas: cons, list e append Cons: acrescenta um elemento à frente da lista >(cons 1 nil) (1) >(cons 1 (cons nil)) (1 ) >(cons a (b c d)) Error: attempt to call `B' which is an undefined function. [condition type: UNDEFINED-FUNCTION] > (cons 'a '(1 3)) (A 1 3) > (cons '(a b) '(1 3)) ((A B) 1 3) > (cons '(1 3) 'a) ((1 3). A) List: toma os seus argumentos (ilimitado) e faz uma lista com eles: >(cons 'a (cons 'b (cons 'c nil))) (A B C) > (list 'a 'b 'c) (A B C) >(list 1 4 5) (1 4 5) >(list (cons 6 nil) (list 3 6 989)) ((6) (3 6 989)) > (list 'a) (A) > (list '(a)) ((A))
Constructores de listas: cons, list e append Append: tem como argumentos listas, acrescentado os elementos da segunda lista no final da primeira lista >(append '(a b) '(c d)) (a b c d) > (append '(a b) '(1 3)) (A B 1 3) > (append '((a b)) '(1 3)) ((A B) 1 3) > (setq list1 '(a b c d e f 1 3 4 5 6)) (A B C D E F 1 3 4 5 6) > (append (cdr list1) (carlist1)) (B C D E F 1 3 4 5 6. A) ;; NOTE: Notice the dot between the 6 and the A? ;; This is because (car list1) is not a list. > (append (cdr list1) (list (car list1))) (B C D E F 1 3 4 5 6 A) > (append (car list1) (cdr list1)) Error: A is not of type LIST. > (append (list (car list1)) (cdr list1)) (A B C D E F 1 3 4 5 6)
Evitar avaliação de listas: quote > '(1 3 4) (1 3 4) > (quote (1 3 4)) (1 3 4) >(setq months '("jan" "feb" "mar" "apr" "may" "jun" "jul" "aug" "sep" "oct" "nov" "dec")) ("jan" "feb" "mar" "apr" "may" "jun" "jul" "aug" "sep" "oct"...) >(nth5 months) "jun >'a a >(cons 'a '(b c d)) (a b c d) >(append '(a b) '(c d)) (a b c d) >(list 3 4) ( 3 4) >(list 'a '(a s d f)) (a (a s d f))
Selectores: car, first, rest, cdr >(first '(a s d f)) a >(car '(a s d f)) a >(first '((a s) d f)) (a s) >(rest '(a s d f)) (s d f) >(rest '((a s) d f)) (d f) >(rest '((a s) (d f)) ((d f)) >(setq a '(a s d f)) (a s d f) >(first a) a >(rest a) (s d f) >(first (resta)) s >(cddr a) (D F) >(cdddr a) (F) >(cadr a) S > (caddr a) D === (car (cdr a)) first, second, third
Mais funções e predicados >(setq a '(a s d f)) (a s d f) >(length '(1 3)) 3 >(length a) 5 >(length (append a a)) 10 >(length '(append a a)) 3 >(length (list a a)) >(atom'a) T >(atom a) NIL >(listp 'a) NIL >(listp a) T
Setq e Setf Setq é util para alterar valores de variáveis: >(setq my-age (+ my-age 1)) 11 >(setq a (cdr a)) (a s d f) Mas por vezes queremos alterar apenas parte de uma variável. Ex: >(setq words '(a list of words)) (A LIST OF WORDS) Alterar parte da lista: >(setq words (cons 'this (rest words))) (THIS LIST OF WORDS) Uso de setf: >(setf (first words) 'the) THE >words (THE LIST OF WORDS) >(setf (third words) 'is) IS >words (THE LIST IS WORDS) >(setf (rest words) '(game is up)) (GAME IS UP) >words (THE GAME IS UP)