Lendo "Um Guia para Programadores de Common Lisp"

Entusiastas de Common Lisp refletem sobre como aprender e trabalhar produtivamente na linguagem, contrastando o REPL orientado por linhas com ferramentas como IPython e recomendando ambientes integrados ao editor, como Emacs+SLIME, Vim+VLIME ou até configurações baseadas em Jupyter para desenvolvimento interativo. Grande parte da troca gira em torno dos construtos explícitos de escopo e ligação do Lisp (por exemplo, `let` vs. `let*`), com alguns vendo neles poder para raciocínio e metaprogramação e outros os considerando herança histórica que dificulta a adoção. Além de ferramentas e design da linguagem, os participantes celebram livros antigos de Lisp e programação e até ambientes clássicos de Lisp machine como o Medley como formas singularmente coerentes e autocontidas de explorar a computação simbólica.

REPL de Common Lisp e fluxo de trabalho iterativo

  • Vários comentadores acham os REPLs de CL estranhos em comparação com o IPython, especialmente para trechos com várias linhas e edição do histórico.
  • Usuários experientes dizem que a forma “certa” não é digitar em um REPL de terminal puro, mas usar um REPL integrado ao editor (“listener”).
  • No Emacs+SLIME ou Vim+Slimv/Vlime, você escreve código em um buffer e envia expressões, regiões ou formas para o REPL por meio de atalhos de teclado. Isso permite avaliação em várias linhas e reavaliação fácil sem depender de histórico baseado em linhas.
  • REPLs de CL são baseados em expressões, não em linhas; para várias expressões sequenciais, você pode envolvê-las em progn ou let para que seja uma única forma para editar e executar novamente.
  • Algumas implementações ou complementos (CLISP com readline, rlwrap, linedit, kernels Jupyter para CL) oferecem histórico de linha mais parecido com o do IPython, mas a maior parte do foco está na integração com o editor.

Ligação de variáveis, escopo e let vs let*

  • Um longo subfio debate por que o CL usa formas como let/let* em vez de sintaxe do tipo “declare variável em qualquer lugar” como var x = y.
  • Os defensores argumentam que o escopo explícito é uma vantagem: as ligações ficam localizadas, são mais fáceis de raciocinar e mais amigáveis para macros e metaprogramação. let faz paralelo com a ligação de parâmetros de uma lambda; let* expressa dependências sequenciais.
  • Os críticos acham a distinção confusa e pouco idiomática em comparação com linguagens no estilo C ou Scheme, que permitem define dentro de blocos, afirmando que isso força aninhamento extra e prejudica a legibilidade.
  • Outros observam que muitas linguagens não-C historicamente também exigiam declarações no início dos escopos; apelos ao “que a maioria das linguagens faz agora” são questionados.
  • Várias macros (nest, macros parecidas com blocos que reescrevem var em lets aninhados, construções do TXR Lisp) são mencionadas como formas de obter estilos sintáticos alternativos sem बदलque ao núcleo da linguagem.
  • Contexto histórico: let surgiu depois como açúcar sintático sobre lambda; let* surgiu ainda mais tarde, e a nomenclatura é em grande parte um legado, não um redesenho novo.

Livros, estilo de documentação e aprender Lisp

  • Os comentadores elogiam livros técnicos antigos (incluindo textos sobre Lisp e AWK) por serem autocontidos, organizados linearmente e por não pressuporem consultas constantes à web.
  • Muitos gostam de ler manuais e livros de linguagem desatualizados por sua perspectiva, estilo e sensação de “instantâneo no tempo”.
  • Caminhos específicos para aprender Lisp mencionados incluem introduções para iniciantes e livros de Common Lisp voltados para IA.
  • Alguns contrastam plataformas antigas e estáveis (DOS, Windows inicial, sistemas Lisp clássicos) com a documentação moderna, fragmentada e só na web, que é mais difícil de navegar linearmente.

Lisp machines, Medley e sistemas relacionados

  • Alguns apreciam o Medley/Interlisp como um ambiente autocontido no estilo de uma Lisp machine, embora outros prefiram implementações modernas de CL com Emacs ou IDEs comerciais.
  • Observa-se que o Mathematica tem uma sensação um tanto parecida com Lisp e uma enorme biblioteca embutida, mas seus objetivos e sua implementação diferem dos sistemas de Lisp machine.