Guia técnico em Notas para estudar Lisp com calma. Encosta em Lua e em notas de programação como Demoscene.
1. O que é Lisp?
Lisp é uma família de linguagens de programação criada no fim dos anos 1950 por John McCarthy.
O nome vem de LISt Processing, ou seja, processamento de listas.
Lisp é uma das linguagens mais antigas ainda em uso e teve enorme influência em áreas como:
- inteligência artificial;
- programação funcional;
- metaprogramação;
- compiladores;
- linguagens interativas com REPL;
- garbage collection;
- manipulação simbólica.
Quando alguém fala “Lisp”, pode estar se referindo a várias linguagens parecidas, como:
- Common Lisp
- Scheme
- Clojure
- Racket
- Emacs Lisp
Lisp não é apenas uma linguagem específica. É uma ideia de linguagem.
2. A grande ideia de Lisp
A característica mais importante de Lisp é que código e dados têm praticamente a mesma estrutura.
Em muitas linguagens, código e dados são coisas bem separadas.
Em Lisp, o próprio código é escrito como listas.
Exemplo:
(+ 2 3)Isso significa:
some 2 e 3O resultado é:
5Em Python, você escreveria:
2 + 3Em Lisp, o operador vem primeiro:
(+ 2 3)Esse estilo se chama notação prefixada.
3. Sintaxe básica
A sintaxe de Lisp é baseada em parênteses.
Uma expressão Lisp geralmente tem esta forma:
(função argumento1 argumento2 argumento3)Exemplos:
(+ 1 2)Resultado:
3(* 4 5)Resultado:
20(- 10 3)Resultado:
7(/ 20 4)Resultado:
5Uma expressão pode conter outras expressões:
(* (+ 2 3) 4)Primeiro:
(+ 2 3)Resultado:
5Depois:
(* 5 4)Resultado final:
204. Listas
Listas são fundamentais em Lisp.
Exemplo de lista:
'(1 2 3 4)O apóstrofo ' impede que Lisp tente executar a lista como código.
Sem o apóstrofo, Lisp pensaria que 1 é uma função:
(1 2 3 4)Isso normalmente causaria erro.
Com o apóstrofo:
'(1 2 3 4)Lisp entende que isso é dado, não código.
Outro exemplo:
'(maçã banana laranja)Isso é uma lista de símbolos.
5. Código como dados
Aqui está a parte mais poderosa — e mais esquisita — de Lisp.
Este código:
(+ 2 3)É também uma lista:
(+ 2 3)Ou seja, o programa tem a mesma forma que os dados.
Isso permite que programas Lisp manipulem outros programas Lisp com muita facilidade.
Essa ideia é chamada de homoiconicidade.
Nome feio, ideia forte:
Em Lisp, código e dados usam a mesma representação básica.
Essa característica torna Lisp excelente para criar:
- macros;
- linguagens internas;
- sistemas simbólicos;
- ferramentas de programação;
- interpretadores;
- compiladores.
6. Funções
Em Common Lisp, uma função pode ser definida com defun.
Exemplo:
(defun quadrado (x)
(* x x))Isso cria uma função chamada quadrado.
Uso:
(quadrado 5)Resultado:
25Outro exemplo:
(defun soma (a b)
(+ a b))Uso:
(soma 10 20)Resultado:
307. Condicionais
Lisp possui condicionais, como if.
Exemplo:
(if (> 10 5)
"maior"
"menor ou igual")Resultado:
"maior"A estrutura é:
(if condição
valor-se-verdadeiro
valor-se-falso)Exemplo com função:
(defun positivo? (x)
(if (> x 0)
"positivo"
"não positivo"))Uso:
(positivo? 7)Resultado:
"positivo"8. Recursão
Lisp é muito associada à programação funcional e à recursão.
Recursão acontece quando uma função chama a si mesma.
Exemplo clássico: fatorial.
Matematicamente:
5! = 5 × 4 × 3 × 2 × 1Em Lisp:
(defun fatorial (n)
(if (= n 0)
1
(* n (fatorial (- n 1)))))Uso:
(fatorial 5)Resultado:
120Como funciona:
(fatorial 5)
= 5 × (fatorial 4)
= 5 × 4 × (fatorial 3)
= 5 × 4 × 3 × (fatorial 2)
= 5 × 4 × 3 × 2 × (fatorial 1)
= 5 × 4 × 3 × 2 × 1 × (fatorial 0)
= 5 × 4 × 3 × 2 × 1 × 1
= 1209. car, cdr e cons
Três operações clássicas de Lisp:
car
Pega o primeiro elemento de uma lista.
(car '(10 20 30))Resultado:
10cdr
Pega o restante da lista, sem o primeiro elemento.
(cdr '(10 20 30))Resultado:
(20 30)cons
Constrói uma nova lista colocando um elemento no começo.
(cons 5 '(10 20 30))Resultado:
(5 10 20 30)Essas funções são antigas, mas importantes para entender a mentalidade Lisp.
10. Macros
Macros são uma das armas mais fortes de Lisp.
Uma função comum recebe valores.
Uma macro recebe código, transforma esse código e devolve outro código.
Isso permite criar novas formas de expressão dentro da linguagem.
Exemplo conceitual:
(defmacro quando (condição &body corpo)
`(if ,condição
(progn ,@corpo)))Uso:
(quando (> x 10)
(print "x é maior que 10"))Isso poderia ser transformado em algo como:
(if (> x 10)
(progn
(print "x é maior que 10")))A ideia importante:
Macros permitem estender a linguagem usando a própria linguagem.
Isso é muito mais poderoso do que apenas criar funções.
11. REPL
Lisp é famosa pelo uso do REPL.
REPL significa:
Read
Eval
Print
LoopOu seja:
- lê uma expressão;
- avalia a expressão;
- imprime o resultado;
- repete o ciclo.
Isso permite programar de forma interativa.
Você escreve:
(+ 2 2)O ambiente responde:
4Esse modo de trabalho influenciou ambientes modernos de Python, JavaScript, Clojure, Racket e várias outras linguagens.
12. Dialetos importantes
Common Lisp
É um Lisp grande, poderoso e cheio de recursos.
Pontos fortes:
- linguagem madura;
- sistema de objetos;
- macros poderosas;
- alta performance possível;
- boa para estudar Lisp clássico.
Pontos fracos:
- comunidade menor;
- ecossistema menos popular que Python ou JavaScript;
- aparência inicial intimidadora.
Scheme
É um Lisp minimalista e elegante.
Pontos fortes:
- ótimo para estudar fundamentos;
- sintaxe pequena;
- muito usado em cursos clássicos de ciência da computação.
Pontos fracos:
- menos usado em sistemas comerciais;
- várias implementações diferentes.
Clojure
É um Lisp moderno que roda principalmente na JVM.
Pontos fortes:
- interoperabilidade com Java;
- bom para sistemas reais;
- forte em programação funcional;
- usado em backend, dados e sistemas concorrentes.
Pontos fracos:
- exige entender JVM para uso profissional;
- sintaxe ainda assusta iniciantes;
- curva de aprendizado não é trivial.
Racket
É descendente de Scheme e muito usado para ensino, pesquisa e criação de linguagens.
Pontos fortes:
- excelente documentação;
- bom ambiente para aprender;
- ótimo para experimentar ideias de linguagens.
Pontos fracos:
- mercado pequeno;
- menos usado em empresas tradicionais.
Emacs Lisp
É o Lisp usado para configurar e estender o editor Emacs.
Pontos fortes:
- permite personalizar profundamente o Emacs;
- muito útil para quem usa Emacs.
Pontos fracos:
- bem específico;
- não é a melhor escolha como primeiro Lisp geral.
13. Por que estudar Lisp?
Você provavelmente não deve estudar Lisp achando que vai virar a linguagem principal do seu trabalho amanhã.
Essa expectativa é ruim.
O melhor motivo para estudar Lisp é outro:
Lisp melhora sua cabeça como programador.
Ela força você a entender:
- funções como valores;
- estruturas recursivas;
- representação de código;
- avaliação de expressões;
- abstrações;
- metaprogramação;
- design de linguagens;
- simplicidade sintática.
Aprender Lisp pode melhorar sua forma de programar em Python, JavaScript, Ruby, Elixir, Rust ou qualquer outra linguagem.
14. Pontos fortes
- Sintaxe extremamente regular.
- Macros muito poderosas.
- REPL interativo.
- Excelente para programação simbólica.
- Influência histórica enorme.
- Boa para aprender fundamentos profundos.
- Código pode ser manipulado como dados.
- Favorece abstrações fortes.
15. Pontos fracos
- Pouco popular no mercado.
- Ecossistema menor que Python, JavaScript ou Java.
- Muitos parênteses assustam no começo.
- Material moderno pode ser mais difícil de encontrar.
- Algumas implementações têm ferramentas menos amigáveis.
- Pode parecer “alienígena” para quem vem de linguagens imperativas.
A verdade brutal:
Lisp é intelectualmente poderosa, mas não é a escolha pragmática padrão para a maioria dos projetos comerciais modernos.
Isso não torna Lisp inútil. Só significa que você deve estudar com o objetivo certo.
16. Comparação rápida com Python
Python:
def quadrado(x):
return x * xLisp:
(defun quadrado (x)
(* x x))Python:
if x > 10:
print("maior")
else:
print("menor ou igual")Lisp:
(if (> x 10)
(print "maior")
(print "menor ou igual"))Python usa sintaxe mais familiar.
Lisp usa uma sintaxe mais uniforme.
Essa uniformidade é o que torna macros e manipulação de código tão naturais em Lisp.
17. Exercícios básicos
Exercício 1
Escreva uma expressão Lisp que some 10, 20 e 30.
Resposta:
(+ 10 20 30)Exercício 2
Escreva uma expressão que calcule:
(2 + 3) × 4Resposta:
(* (+ 2 3) 4)Exercício 3
Crie uma função que calcule o dobro de um número.
Resposta:
(defun dobro (x)
(* x 2))Uso:
(dobro 8)Resultado:
16Exercício 4
Crie uma função que diga se um número é maior que 100.
Resposta:
(defun maior-que-100? (x)
(if (> x 100)
"sim"
"não"))Exercício 5
Use car para pegar o primeiro item da lista:
'(a b c d)Resposta:
(car '(a b c d))Resultado:
a18. Roteiro de estudo recomendado
Etapa 1 — Sintaxe básica
Estude:
- expressões;
- listas;
- notação prefixada;
- avaliação;
- aspas com
'.
Objetivo:
Conseguir ler código Lisp simples sem travar nos parênteses.
Etapa 2 — Funções
Estude:
defun;- parâmetros;
- retorno;
- composição de funções.
Objetivo:
Escrever pequenas funções matemáticas e utilitárias.
Etapa 3 — Listas
Estude:
car;cdr;cons;- listas aninhadas;
- recursão sobre listas.
Objetivo:
Entender por que listas são tão centrais em Lisp.
Etapa 4 — Recursão
Estude:
- fatorial;
- Fibonacci;
- soma de listas;
- busca em listas.
Objetivo:
Parar de depender apenas de loops tradicionais.
Etapa 5 — Macros
Estude macros só depois de entender bem funções e listas.
Objetivo:
Entender como Lisp consegue modificar a própria linguagem.
Não tente aprender macros no primeiro dia. É pedir para sofrer à toa.
19. O que instalar para praticar
Algumas opções:
Para Common Lisp
- SBCL
- Quicklisp
- Portacle
Para Scheme/Racket
- Racket
Para Clojure
- Clojure CLI
- Leiningen
- Babashka
Para começar, a escolha mais amigável costuma ser:
Racket, se o objetivo é aprender.
Common Lisp, se o objetivo é entender Lisp clássico.
Clojure, se o objetivo é usar ideias Lisp em sistemas modernos.
20. Conclusão
Lisp é uma linguagem de programação, mas também é uma forma diferente de pensar programação.
Ela não venceu o mercado de massa, mas influenciou quase tudo.
Estudar Lisp vale a pena porque ensina ideias profundas:
- código como dados;
- funções como blocos fundamentais;
- avaliação simbólica;
- macros;
- abstração;
- composição;
- simplicidade estrutural.
Resumo final:
Lisp não é a linguagem mais popular.
Lisp não é a mais fácil para arrumar emprego.
Lisp não é a escolha óbvia para projetos comuns.
Mas Lisp é uma das melhores linguagens para expandir sua cabeça como programador.
21. Mini glossário
| Termo | Significado |
|---|---|
| Lisp | Família de linguagens baseada em listas |
| Lista | Estrutura central de dados em Lisp |
| S-expression | Expressão simbólica escrita com parênteses |
| REPL | Ambiente interativo de leitura, execução e resposta |
| Macro | Código que transforma código |
| Homoiconicidade | Código e dados compartilham representação parecida |
car | Primeiro elemento de uma lista |
cdr | Resto da lista |
cons | Cria uma nova lista adicionando um item no começo |
| Common Lisp | Dialeto robusto e clássico |
| Scheme | Dialeto minimalista |
| Clojure | Lisp moderno sobre a JVM |
| Racket | Dialeto educacional e experimental |
22. Próximos passos práticos
- Instale Racket ou SBCL.
- Abra um REPL.
- Teste expressões simples.
- Escreva funções pequenas.
- Brinque com listas.
- Depois estude recursão.
- Só então entre em macros.
Não pule direto para macros.
Esse é o erro clássico de quem quer parecer avançado antes de entender o básico.