P: Por que o elisp não possui espaços para nome e como podemos obtê-los?
O Elisp não possui espaços para nome que não sejam o global, o que levou à convenção de codificação de prefixar todas as funções, variáveis e constantes globais com um prefixo exclusivo.
Além do fator de aborrecimento, isso também me parece uma questão fervilhante, dado 1) o número sempre crescente de grandes bibliotecas e pacotes e 2) a existência contínua de funções e variáveis herdadas que não respeitam a convenção de prefixo ou são suficientemente idiossincráticos que não há realmente uma boa opção de prefixo que eles possam usar. Isso também significa que tentativas periódicas de racionalizar códigos mais antigos (como na transição de cl
para cl-lib
) é uma quantidade de trabalho não trivial. (Embora eu esteja feliz com a limpeza, ainda choro toda vez que digito algo assim cl-find
).
Fui bisbilhotando para ver se conseguia descobrir por que o elisp ainda não possui espaços para nome após algumas décadas de uso, mas fiquei um pouco surpreso com a colheita modesta. A página wiki sobre namespaces é bastante curta. Nic Ferrier tem um tratamento um pouco mais longo do problema, e há um tópico bastante recente no emacs-devel também. Há um antigo thread Stack Overflow de 2010 que discute a possibilidade de usar macros para implementar namespaces; outro exemplo da abordagem macro pode ser encontrado aqui . Existem pelo menos algumas implementações ( aqui e aqui , com uma descrição desta última aqui) por aí, mas eles não vêem muita atividade há alguns anos, e eu não encontrei nenhuma biblioteca que as use.
Presumo que, se a adição de namespaces fosse fácil, isso já seria feito. Tão:
- Quais são as barreiras técnicas para adicionar namespaces ao elisp?
- Adicionar espaços para nome quebraria muito código existente?
- Essa funcionalidade é algo que precisa ser orgânico para ser elisp (alterações no próprio intérprete) ou realmente pode ser construído no topo por meio de macros?