11 pontos por GN⁺ 2025-01-13 | 2 comentários | Compartilhar no WhatsApp

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-image do 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

 
GN⁺ 2025-01-13
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

    • SBCL é um sistema muito dinâmico, e foi possível resolver o problema via REPL mesmo 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

    • Foi útil ao escrever scripts rápidos usando babashka
  • O uso de vim-slime melhorou muito a produtividade e a satisfação no desenvolvimento

    • É útil por permitir usar REPL em várias linguagens
    • doom-emacs também é semelhante ao vim e pôde aumentar a produtividade
  • 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

    • Foi possível resolver problemas de RSI alterando o mapeamento de teclas no Emacs
  • Usa Common Lisp como hobby e quer executar código C# no REPL do SBCL

    • O ciclo de feedback é muito rápido, permitindo resolver problemas imediatamente
  • Compartilhou a experiência de desenvolver aplicações CLI com Clojure e babashka

    • Foi possível melhorar o desempenho usando a biblioteca methodical
  • 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

 
gurugio 2025-01-13

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 ;-)