Que problema prático resulta da falta de macros higiênicas no Clojure?


11

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:

  1. Como gensymas macros higiênicas diferem?
  2. O que as macros do Racket fornecem que o Clojure não fornece? (seja segurança, composição ou qualquer coisa)

2
Macros higiênicas são macros cuja expansão é garantida para não causar a captura acidental de identificadores. O problema geral da captura acidental era bem conhecido na comunidade Lisp antes da introdução de macros higiênicas. Os gravadores de macro usariam recursos de linguagem que gerariam identificadores exclusivos (por exemplo, gensym) ou usariam identificadores ofuscados para evitar o problema. As macros higiênicas são uma solução programática para o problema de captura que é integrado ao próprio expansor de macros. en.wikipedia.org/wiki/Hygienic_macro
Robert Harvey

3
Como o sistema de macros higiênico da [Racket] possui um profundo conhecimento de como sua macro funciona, sua macro é extremamente bem integrada ao ambiente: o destaque da sintaxe funciona corretamente, a renomeação automática de variáveis ​​funciona corretamente, a referência cruzada funciona corretamente e as demais recursos IDE lisos de [Racket]. Em outras palavras, a higiene não protege apenas contra erros simples, como captura de variáveis ​​- permite que seu código seja formalmente analisado por ferramentas que simplesmente não poderiam existir para o Common LISP. randomhacks.net/2002/09/13/hygienic-macros
Robert Harvey

Respostas:


6

A vantagem das macros higiênicas não é a capacidade de linguagem - você pode escrever macros que tenham boa higiene usando gensyme 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.


2
gensymimpede 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 redefinir ifou 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.)
Phil

2
Macros anti-higiênicas são certamente úteis. Não tenho certeza sobre o Scheme, mas o Racket tem muitas operações de "flexão da higiene". As macros do idioma são higiênicas por padrão. Eles apenas o deixam muito consciente quando você quebra a higiene.
Phil
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.