Páginas

Tuesday, July 19, 2011

Escolhendo um Lisp: do Clojure ao Racket

Graças a um email de um amigo, o Lucas Teixeira, finalmente escrevi algumas coisas que já vinha comentando com algumas pessoas, geralmente nos pós-dojos.

Era pra ser um email pro Lucas, mas acabei expressando coisas que poderiam ficar públicas.

Bem, ele começou dizendo no email:
Então... sempre quis aprender programação funcional. Já tentei Haskell, LISP, Scheme, mas nunca pegou de verdade.

Tô tentando aprender Clojure agora. Baixei o Clojure Box e uns tutoriais da Internet. Tô resolvendo uns problemas do Project Euler e o clojure-koans.

Tem alguma dica de material?

Que tipo de coisa você tá / tava fazendo com Clojure?
Cara, foi muito surpreendente seu email.

Vamos a um apanhado de impressões sobre algumas linguagens da família lisp, começando com Clojure, passando por Common Lisp, Scheme e chegando em Racket.

Clojure

Semana passada o Ronald Kaiser me chamou pra montar propostas pra mandarmos pra Clojure/conj.
Bem, pra falar de Clojure tenho que relembrar a época em que trabalhei na Intelie.

Lá na Intelie ajudei no desenvolvimento do Intelie Event Manager, "um sistema de monitoração em tempo real capaz de analisar milhares de eventos por segundo e identificar tendências e situações de risco para TI e o negócio". O IEM tinha na época parte do seu backend escrito em Clojure.

A experiência, no segundo semestre de 2010, foi muito divertida, e, falando especificamente do Clojure, de certa forma a questão do ambiente de desenvolvimento era uma coisa chata que não me dava muito gosto de começar coisas particulares usando a linguagem.
Tentei por um tempo montar um ambiente redondo com o Emacs, inclusive usando Clojure Box entre outras opções.

Lá na Intelie eu usava o IntelliJ IDEA com o plugin La Clojure, mas essa combinação consumia muitos recursos do sistema, e não funcionava tão bem quando Emacs com SLIME.

Mas, na boa, a curva do Emacs é bem inclinada, e mesmo gostando muito dele e sabendo usar o básico, eu queria algo mais simples, mais gedit-like, que eu pudesse levar pra todo lado, mostrar pra qualquer um, sem ter que carregar meu .emacs debaixo do braço e sem ter que assustar muito as pessoas, por exemplo no Dojo.

Particularmente gostei de usar a STM do Clojure, e sentia prazer em poder expressar de forma tão bonita certas coisas que implementamos. Também era conveniente ter a rica gama de estruturas de dados que a linguagem oferece, suportados por uma sintaxe simples e compatível com as s-expressions.
Como material, eu li o Practical Clojure, mas também tem o Clojure In Action, Programming Clojure e The Joy of Clojure.

Common Lisp

Depois da Intelie eu fiquei por um tempo namorando o Common Lisp, que foi o primeiro lisp com o qual tive contato. Li parcialmente o Land of Lisp, excelente livro, muito divertido e recomendado, entre outras fontes (On Lisp e Practical Common Lisp vem em mente). Mas de novo o Emacs de um lado, e a "velhice" da linguagem do outro lado, me fizeram continuar minha jornada, buscando novas opções.

O CL é legal por ser um padrão ANSI. Por esse mesma razão ele é uma "merda". Por que esse padrão é antigo e não evolui. Não tem nenhuma empresa ou indivíduo ou grupo por traz de novas revisões, atualizações, não tem nenhuma "implementação padrão".

Veja Python: a linguagem é mais que CPython, existe uma especificação, mas CPython é a referência, a implementação viva, que evolui, 2.x, 3.x, etc. E lá vão PyPy, IronPython, ActivePython, etc...

O CL tem várias implementações, algumas mantidas, outras abandonadas. Uma vez eu queria fazer um script que consumisse parâmetros da linha de comando. Pra minha surpresa, o tal padrão ANSI não fala nada a respeito, e ficava a cargo de cada implementação prover um jeito de fazer isso. E claro, cada uma escolheu um jeito mais esquisito e mais incompativel com as outras possível.

Scheme

Com Scheme eu também tive algum contato em Portugal, no IST. Pouco, mas suficiente para me deixar interessado. Vi código, mas não escrevi nada significativo.
Scheme também tem várias implementações e nenhuma "canônica". Mas tem um grande diferencial em relação ao CL, que a torna uma linguagem viva: um sistema de revisões. Antes era o R5RS, hoje é o R6RS e amanhã sairá o R7RS.

Ah, lembro bem quando o prof. António Leitão falou da pureza de conceitos, e do exemplo clássico do "define".
Como definir uma variável? Define. Como definir uma função? Define. Como definir qualquer coisa? Define. E ele comparou com Python, que tem um número "absurdo" de sintaxes para fazer "a mesma coisa", definir: =, def, class, etc.

Apesar de a linguagem vir de uma linhagem minimalista, acaba que é mais provavel ver coisas mudando pra melhor em Scheme do que em CL, e neste caso qualquer mudança é melhor do que ficar parado no tempo.
O R6RS por exemplo adicionou um monte de coisas no padrão da linguagem, e muitos puristas não gostaram da ideia.

Existem várias implementações aparentemente muito legais, como Chicken, Gambit, e outras.
Algumas compilam pra C, outras pra bytecode, outras só interpretam... tem de tudo.

E nessa de escolher um Scheme, o PLT Scheme era mais um implementação. Engraçado que já tinha me deparado com ela uma vez e simplesmente "ignorei" no momento e fui lá paquerar o Common Lisp.

Mas acabei voltando uma noite qualquer, e caindo no site do Racket e dando uma chance pra ele. Me encantei.

Racket

A equipe PLT tem o diferencial educacional. O Racket tem muitos diferenciais. Ele não é só um Scheme. Você pode programar em Scheme R5RS ou R6RS, mas a linguagem Racket é muito mais rica, é uma "linguagem para escrever linguagens", e o pacote vem com coisas muito interessantes.

Lembra do Python com baterias incluídas? Pois é, o Racket tem baterias incluídas, um conjuto de baterias diferente dos de Python. Algumas são tão legais, mais legais até que as que tem no Python...

Por exemplo, hoje pra mim a melhor ferramenta pra fazer apresentações de slides é o Slideshow do Racket.
Poder colocar imagens dentro dos arquivos, fantástico. Tudo programável...

Para aprender mais sobre Racket, existem livros, tutoriais, papers, lista de discussão, IRC, entre outros recursos.

Bem, listar com mais detalhe cada coisa que me faz gostar de Racket é para outros posts. Alguns eu já escrevi, veja:
Para todos os outros posts sobre Racket no meu blog:

3 comments:

caike said...

Valeu, Rodolfo! Estou começando a ler a respeito de Clojure (principalmente depois que o Heroku anunciou suporte a mesma) e seu post me ajudou a entender um pouco mais sobre o mundo LISP. Abração!

Rodolfo said...

Legal Caike! Junte o Emacs + SLIME + Clojure e divirta-se :D

Abraço!

Ronan Neto said...

ainda sim eu gosto muito de CL
por ser uma liguagem grande, e permitindo fazer algumas coisas que no Scheme e bem mais dificil.bindings por exemplo.