Por que escolhi Common Lisp
(blog.djhaskin.com)Adeus, Clojure
- Usei Clojure por cerca de 7 anos, mas deixei de ficar satisfeito por causa do problema de "inicialização lenta" em apps CLI
- Havia projetos como o babashka, mas mesmo com
native-imagedo GraalVM e afins foi difícil resolver a lentidão na inicialização - "Inicialização rápida de executáveis standalone" virou um requisito essencial, e concluí que Clojure não atendia a isso
Procurando um novo Lisp
- Pesquisei várias linguagens em busca de um novo Lisp, procurando uma que pudesse resolver os problemas que enfrentei em projetos anteriores
- Não havia "requisitos explícitos", mas no fim organizei os seguintes critérios
- Deve ser possível gerar "executáveis independentes que iniciem rápido" com uma toolchain razoável (resolvendo a principal queixa com Clojure)
- Como não posso usar Emacs, precisa funcionar no Vim
- Suporte a Windows e Mac é essencial; não basta suportar apenas sistemas Linux/POSIX
- Seria bom ter possibilidade de integração com outras linguagens de grandes comunidades, como Clojure e Java
- A velocidade em tempo de execução deve ser suficientemente rápida (de preferência no nível do Clojure ou melhor)
- O suporte a multithreading deve ser forte e, se possível, sem algo como o GIL (Global Interpreter Lock)
- Uma comunidade forte é indispensável
- Deve ter um ecossistema rico e, no mínimo, as seguintes bibliotecas precisam existir:
- Parsing e serialização de JSON
- Suporte a Sqlite3
- Biblioteca para requisições HTTP
- Suporte a estruturas de dados funcionais como em Clojure (embora isso seja menos importante)
- Linguagens pesquisadas
- Scheme : os problemas de padronização entre r6rs e r7rs dividiram a comunidade, o que não me atraiu, e o ecossistema era pequeno demais para atender às necessidades
- Racket : usei na época de estudante, mas não gosto porque o runtime parece lento e pesado
- Common Lisp : encontrei em lisp-lang.org. A comunidade e os materiais me impressionaram, então decidi experimentar
Magic Happens Here
- Vou pular a história completa da minha jornada aprendendo Common Lisp, mas o processo foi árduo
- O começo foi errado. No Natal, ganhei o livro CLtLv2 e comecei lendo por ele
- Depois descobri o HyperSpec e passei a estudar por ele, seguindo um caminho melhor
- Havia características únicas do Common Lisp
- É uma linguagem padronizada, mais parecida com C do que com Java nesse aspecto
- Vários compiladores, interpretadores e runtimes implementam o padrão
- Existem ferramentas como o Roswell para instalar e gerenciar diferentes implementações
- A implementação mais popular na comunidade é considerada o SBCL
- E se eu conhecesse Janet quando comecei a explorar?
- Janet tem as seguintes características, então talvez eu tivesse ficado satisfeito antes mesmo de aprender Common Lisp
- Sintaxe concisa, executáveis rápidos e pequenos, suporte a C FFI
- Existe um guia introdutório divertido
- Atende a todos os requisitos que eu considerava importantes
- Ainda assim, escolhi Common Lisp
- Eu teria perdido recursos avançados que descobri depois, como CLOS e o Condition System
- Common Lisp é uma linguagem mais poderosa
Requisitos atendidos
Depois de confirmar que Common Lisp atendia aos requisitos, escolhi-a como minha próxima linguagem Lisp e continuo usando até hoje. Os principais achados foram os seguintes:
- Executáveis independentes:
- Há várias formas de criar executáveis standalone em Common Lisp
- Dependendo de estarem compactados ou não, o tempo de inicialização pode variar de frações de segundo a algo praticamente instantâneo
- Esse recurso não é uma opção secundária, mas foi pensado como uma das principais formas de distribuir programas Lisp
- Fluxo de trabalho com Vim:
- Há várias opções excelentes, mas pessoalmente montei meu próprio workflow no Vim
- Também constatei que o VS Code é suficientemente bom para usar como IDE de Common Lisp
- Suporte a Windows/Mac/Linux:
- O SBCL oferece bom suporte aos principais sistemas operacionais
- Integração com grandes ecossistemas imperativos:
- A maioria das implementações oferece boa integração com a linguagem C, aproveitável via CFFI
- Velocidade em tempo de execução:
- O SBCL é muito rápido em runtime
- Multithreading:
- O padrão de Common Lisp não inclui suporte explícito a multithreading, mas as principais implementações oferecem isso
- A biblioteca Bordeaux-Threads reduz as diferenças entre implementações
- Bibliotecas como lparallel, cl-async e blackbird permitem programação multithread e assíncrona
- Comunidade forte:
- Descobri a atividade da comunidade e passei a participar
- Os resultados da pesquisa da comunidade de 2024 e o European Lisp Symposium mostram uma comunidade Common Lisp bastante ativa
- Também há forte apoio comunitário na rede de blogs e no subreddit
- Ecossistema:
- A maioria usa Quicklisp, mas pessoalmente gerencio pacotes com OCICL
- É possível explorar bibliotecas e informações técnicas no Common Lisp Cookbook, CLiki e Awesome CL
- Suporte de bibliotecas específicas:
- JSON: jzon
- Sqlite3: cl-sqlite
- Requisições HTTP: dexador
- Estruturas de dados funcionais: FSet, cl-hamt
Observações para quem está chegando agora
- Como o número de iniciantes no Discord de Common Lisp vem aumentando, escrevi isto para compartilhar o processo pelo qual escolhi e me adaptei ao Common Lisp
- Espero que este texto ajude quem estiver se interessando por Common Lisp
2 comentários
Comentários do Hacker News
Foi marcante a experiência de resolver um problema usando SBCL mesmo sem o código-fonte. Com outras stacks tecnológicas, provavelmente não teria sido possível corrigir isso tão rápido sem o código-fonte
Compartilhou a experiência de migrar de Common Lisp para Clojure, destacando que os recursos de concorrência do Clojure eram atraentes
O uso de vim-slime melhorou muito a produtividade e a satisfação no desenvolvimento
Disse que não entende o valor de Lisp, mas se lembra de uma música relacionada
Afirmou que Emacs/slime é uma IDE para Lisp melhor do que vim-slime
Usa Common Lisp como hobby e quer executar código C# no REPL do SBCL
Compartilhou a experiência de desenvolver aplicações CLI com Clojure e babashka
Teve problemas ao usar native-image e considera Clojure uma linguagem quase perfeita
Expressou interesse na linguagem Janet e mencionou que o README e o FAQ do projeto no GitHub são úteis
Compartilhou uma experiência que despertou a vontade de aprender Lisp, especialmente porque o autor, fã de vim, pareceu atraente
Eu não entendia o valor de Lisp, mas me lembro de uma música relacionada... Há muitas músicas sobre Lisp, e no YouTube existe uma chamada Land of Lisp ;-)