Ouvi dizer que as macros Clojure são mais fáceis de escrever, mas não tão confiáveis quanto as macros higiênicas de Racket. Minha pergunta tem 2 partes:
- Como
gensym
as macros higiênicas diferem? - O que as macros do Racket fornecem que o Clojure não fornece? (seja segurança, composição ou qualquer coisa)
Respostas:
A vantagem das macros higiênicas não é a capacidade de linguagem - você pode escrever macros que tenham boa higiene usando
gensym
e cuidadosas aspas / aspas nos momentos certos. No entanto, as macros higiênicas garantem uma boa higiene. Nesse aspecto, é um pouco como a verificação de tipo.Também pode haver vantagens em ferramentas para macros higiênicas. A maioria dos sistemas de macros higiênicos impõe controles rígidos sobre o que sua macro faz e como faz (por exemplo, você não pode executar código arbitrário quando uma macro definida pelo esquema
syntax-case
é expandida). Isso facilita a gravação de programas que "entendem" sua macro e pode fornecer suporte adicional a ferramentas.Por outro lado, há alguns casos em que macros não higiênicas podem ser úteis. Por exemplo, se você realmente deseja capturar uma ligação para uma variável específica (por exemplo, macros anafóricas ), acho que não terá sorte se tiver apenas macros higiênicas.
fonte
gensym
impede que a macro mexa acidentalmente com o usuário da macro, mas não impede que o usuário mexa com a macro. Por exemplo, um usuário de macro pode redefinirif
ou algo assim. (A pergunta "por que alguém iria fazer isso" é irrelevante Este é um exemplo simples que demonstra que é possível, e é complicado para raciocinar sobre macros não higiênicas.)