Você está na página 1de 10

Common Lisp

A linguagem de programao programvel

Vtor De Arajo
htp://inf.ufrgs.br/~vbuaraujo/

Lisp
(defun fac (n) (if (= n 0) 1 (* n (fac (- n 1)))))

Lots of Irritating Stupid Parentheses? LISt Processing! O cdigo uma srie de listas Representam a rvore sinttica do programa Macros podem manipul-las diretamente!

Lisp uma linguagem homoicnica Cdigo representado por estruturas de dados da prpria linguagem

S-Expressions
(+ 2 3)
tomos smbolo!

lista

tomos: objetos indivisveis nmeros strings smbolos: representam os identificadores da linguagem Listas: dados compostos So formadas a partir de pares (cons cells) car (ou first): primeiro elemento do par cdr (ou rest); segundo elemento do par (geralmente outro par ou nil)

Macros

Funes que recebem cdigo e retornam cdigo Chamadas em tempo de compilao

(defmacro backwards (args) (reverse args)) (backwards (2 3 +)) => (+ 3 2) => 5

Permitem a criao de novas construes sintticas while, foreach, try/catch, pattern matching... Eliminam duplicaes de cdigo Permitem abstrair padres no cdigo

Macros manipulao de cdigo


(setf x 2) (setf y 3) (+ x y) => 5 '(+ x y) => (+ x y) `(+ ,x ,y) => (+ 2 3)
no quote: Trata como cdigo

quote: Trata como dado

backquote: Trata como dado, mas permite inserir trechos de cdigo Usado para criar um template onde se insere o cdigo desejado

Macros um exemplo

agrupa os argumentos restantes em uma lista

(defmacro while (test &rest body) cria uma label para onde se pode saltar `(tagbody start substitui pelo teste passado como argumento (if ,test agrupa vrios comandos sob o if (como { } em C) (progn backquote substitui pelo cdigo passado como argumento ,@body salta para a label criada (go start)))))
expande a lista criada por &rest

(setf x 0) (while (< x 10) (print x) (incf x))

Macros um exemplo
(defmacro while (test &rest body) `(tagbody start (if ,test (progn ,@body (go start)))))

(setf x 0) (while (< x 10) (print x) (incf x))

Outras possibilidades

Banco de dados: integrar SQL na linguagem (e.g., biblioteca CLSQL) Unit testing: tanto executa quanto imprime cdigo

(defmacro test (code expected) `(if (not (equal ,code ,expected)) (format t "Test ~s failed!~%" ',code))) > (test (+ 2 3) 6) Test (+ 2 3) failed!

Gerao de HTML, e.g., CL-WHO:

(with-html-output (*http-stream*) (loop for (link . title) in '(("http://zappa.com/" . "Frank Zappa") ("http://marcusmiller.com/" . "Marcus Miller") ("http://www.milesdavis.com/" . "Miles Davis")) do (htm (:a :href link (:b (str title))) :br)))

Linguagem infinitamente extensvel!

Common Lisp Outras caractersticas interessantes

Suporta programao funcional (funes so valores de primeira classe)

(map #'+ '(1 2 3) '(10 20 30)) => (11 22 33)

Compilador faz parte do runtime possvel compilar cdigo em tempo de execuo PPCRE: Expresses regulares tipo Perl at 5x a velocidade da implementao original (em C) Common Lisp Object System Tipagem dinmica (elimina a necessidade de algumas "design patterns") Multiple dispatch (mtodo chamado pelo tipo de todos os argumentos)

Method combinations

Desenvolvimento interativo Ambientes que permitem testar cdigo medida em que escrito Compilao incremental Lisp is fun!

Mais informaes...

Practical Common Lisp http://gigamonkeys.com/book/ On Lisp http://www.paulgraham.com/onlisp.html CLiki Common Lisp Wiki http://cliki.net

Contato? vbuaraujo@inf.ufrgs.br

Você também pode gostar