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
prognouletpara 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” comovar 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.
letfaz 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
definedentro 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 reescrevemvaremlets 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:
letsurgiu 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.