Uma das linguagens de programação mais interessantes que já conheci é Lisp.Antes de começar, gostaria de pedir um pouco de tolerância e boa vontade do leitor, pois não sei programar em Lisp, só conheço o básico, portanto vou me arrastar pelo artigo tentando dizer algo útil… =/
Lisp é uma linguagem de programação funcional muito usada em projetos de IA. Há também algumas aplicações conhecidas feitas em Lisp, como Emacs e AutoCAD.
Antes de ser padronizada como Common Lisp, havia muitos dialetos.
Se você possui um sistema GNU/Linux a mão, podemos começar a experimentar:
bash$ clisp
i i i i i i i ooooo o ooooooo ooooo ooooo
I I I I I I I 8 8 8 8 8 o 8 8
I \ `+' / I 8 8 8 8 8 8
\ `-+-' / 8 8 8 ooooo 8oooo
`-__|__-' 8 8 8 8 8
| 8 o 8 8 o 8 8
------+------ ooooo 8oooooo ooo8ooo ooooo 8
Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2006
[1]> Os comandos em Lisp são chamados forms e representados sempre entre parêntesis. Por exemplo:
[1]> (print "Olá Mundo!")
"Olá Mundo!"
"Olá Mundo!"
[2]> A primeira impressão é o resultado do form
print, a segundo é o retorno.Para criar uma variável podemos usar
setq:[2]> (setq foo 12)
12
[3]> foo
12
[4]> Outra forma é com
let, que faz atamento, mas então a variável só existe no escopo:[4]> (let ((bar 15)) (print foo) (print bar))
12
15
15
[5]> O último
15 é o retorno de let, que é o mesmo retorno do último form do escopo – (print bar).Agora veja:
[5]> foo
12
[6]> bar
*** - EVAL: variable BAR has no value
The following restarts are available:
USE-VALUE :R1 You may input a value to be used instead of BAR.
STORE-VALUE :R2 You may input a new value for BAR.
ABORT :R3 ABORT
Break 1 [7]> abort
[8]> Há alguns símbolos especiais, como
t (verdadeiro), nil (nulo) e as palavras-chave, iniciadas por ::[8]> :teste-de-lisp
:TESTE-DE-LISP
[9]> Lisp possui uma estrutura de par chamada cons:
[9]> (cons 3 4)
(3 . 4)
[10]> Listas em Lisp são conses aninhados:
[10]> (cons 1 (cons 2 (cons 3 (cons 4 nil))))
(1 2 3 4)
[11]> Um apelido para isso é:
[11]> (list 1 2 3 4)
(1 2 3 4)
[12]> O form
car retorna o primeiro elemento do cons e o form cdr retorna o segundo:[12]> (car (list 1 2 3 4))
1
[13]> (cdr (list 1 2 3 4))
(2 3 4)
[14]>Só alguns forms – nem de longe tudo:
push– coloca um elemento no começo de uma lista, retornando a lista;pop– remove o primeiro elemento de uma lista, retornando-o;defun– define e retorna uma função;format– imprime e/ou retorna uma string;if,case,condewhen– forms condicionais;block,progeprogn– bloco;loop– ciclo (loop) incondicional;dolist– equivale mais ou menos aoforde Python;lambda– lambda!!!sort– ordenação;=,eqeequal– igualdade;find– procura elemento numa lista.
Uma coisa curiosa de Lisp é sua sintaxe extremamente funcional:
[14]> (if (= foo 12) "sim" "não")
"sim"
[15]> Repare em
(= foo 12)! Primeiro a função a ser executada – igualdade –, depois os parâmetros.Para terminar de forma interessante esse artigo, segue o crivo de Aristóstenes:
(let ((c 0) (noprime (list)) (index 1) (max 5000))
(loop
(setq index (+ index 1))
(if (not (find index noprime))
(progn
(format t "~D~4@T" index)
(setq c (+ c 1))
(let* ((j (* index 2)))
(loop
(pushnew j noprime)
(when (>= j max) (return))
(setq j (+ j index))
)
)
)
)
(when (>= index max) (return))
)
(format t "~%Contagem de primos: ~D~%" c)
)[update 2008-06-13]Código sugerido pelo Pedro:(defun primos (max)
(let ((c 0) (noprime ()))
(loop
for index-1 from 2 to max
unless (member index-1 noprime)
do (format t "~D~4@T" index-1)
(incf c)
(loop
for index-2 from (* index-1 2) to max by index-1
do (pushnew index-2 noprime)))
(format t "~%Contagem de primos: ~D~%" c)))
Valeu Pedro![/update]
Em outro momento explicarei comando a comando. Por ora, espero que achem Common Lisp tão interessante quanto achei. Para mais informações, vejam em meu del.icio.us, principalmente esse tutorial.
[]'s
Cacilhas, La Batalema

8 comentários:
Olá,
Ainda existem diversos dialetos de Lisp -como Scheme. Common Lisp é apenas mais um deles.
Excelente blog.
[]s
É verdade, Phillip!
Havia me esquecido de Scheme, um dialeto interessante. =)
Talvez eu estude um pouco de Scheme para postar aqui, só pela importância que vejo nessa linguagem, como fiz com Common Lisp.
Mas não gosto muito de fazer isso, prefiro aprender direitinho a linguagem antes de dizer qualquer coisa, para mitigar as besteiras. =/
No mais, valeu pelo comentário e pelo elogio também. Esperamos que você volte e participe sempre!
[]'s
Cacilhas, La Batalema
PS: Você foi montegasppizado.
Ah!
Aproveitando a deixa, em ambiente GNU/Linux, um bom interpretador pra Scheme é guile, que costuma acompanhar as distros mais famosas.
E um bom lugar para se começar a estudar Scheme é no schemers.org.
[]'s
Cacilhas, La Batalema
Legal.
Nunca vi Lisp além do que está na Wikipedia ou em artigos como este. Mas acho que ela contribuiu bastante para as linguagens posteriores.
Código melhorado:
(let ((c 0) (noprime (list)) (max 10000))
(loop
for index-1 from 2 to max
do (if (not (find index-1 noprime))
(progn
(format t "~D~4@T" index-1)
(setq c (+ c 1))
(loop
for index-2 from (* index-1 2) to max by index-1
do (pushnew index-2 noprime)))))
(format t "~%Contagem de primos: ~D~%" c))
[]'s
Cacilhas, La Batalema
ótimo post!
tenho uma vontade de aprender lisp! ta faltando um tempinho..
parabens.
Legal que está gostando de Common Lisp. Talvez voce tenha interesse em participar da lista de discussão do lisp-br: www.lisp-br.org
Uma sugestao para a funcao de primos: (cria lista vazia com (), usa unless no lugar de (if (not, usa incf no lugar de (setq c (+ c 1))
(defun primos (max)
(let ((c 0)
(noprime ()))
(loop for index-1 from 2 to max unless (member index-1 noprime) do
(format t "~D~4@T" index-1)
(incf c)
(loop for index-2 from (* index-1 2) to max by index-1
do (pushnew index-2 noprime)))
(format t "~%Contagem de primos: ~D~%" c)))
Lisp é realmente mutio interessante...estou começando a estudar LIsp agora...
Postar um comentário