Quale problema pratico deriva dalla mancanza di macro igieniche in Clojure?


11

Ho sentito che le macro Clojure sono più facili da scrivere ma non affidabili come le macro igieniche di Racket. La mia domanda ha 2 parti:

  1. In che cosa gensymdifferisce dalle macro igieniche?
  2. Cosa forniscono le macro Racket che Clojure non ha? (che si tratti di sicurezza, componibilità o altro)

2
Le macro igieniche sono macro la cui espansione è garantita per non causare l'acquisizione accidentale di identificatori. Il problema generale della cattura accidentale era ben noto all'interno della comunità Lisp prima dell'introduzione di macro igieniche. Gli autori di macro utilizzerebbero funzionalità linguistiche che genererebbero identificatori univoci (ad es. Gensym) o utilizzerebbero identificatori offuscati per evitare il problema. Le macro igieniche sono una soluzione programmatica al problema di acquisizione che è integrata nell'espansione macro stessa. en.wikipedia.org/wiki/Hygienic_macro
Robert Harvey,

3
Poiché il sistema macro igienico di [Racket] ha una profonda conoscenza di come funziona la macro, la macro è estremamente ben integrata nell'ambiente: l'evidenziazione della sintassi funziona correttamente, la ridenominazione automatica delle variabili funziona correttamente, il riferimento incrociato funziona correttamente e così tutti gli altri slick [Racket] caratteristiche IDE. In altre parole, l'igiene non ti protegge solo da semplici bug come l'acquisizione variabile, ma consente al tuo codice di essere formalmente analizzato da strumenti che semplicemente non potrebbero esistere per Common LISP. randomhacks.net/2002/09/13/hygienic-macros
Robert Harvey

Risposte:


6

Il vantaggio delle macro igieniche non è la capacità linguistica: puoi scrivere macro che abbiano una buona igiene usando gensyme citando / annullando la citazione con attenzione al momento giusto. Tuttavia, le macro igieniche assicurano una buona igiene delle macro. Sotto questo aspetto, è un po 'come il controllo del tipo.

Potrebbero inoltre esserci vantaggi di attrezzamento per le macro igieniche. La maggior parte dei sistemi macro igienici impone controlli rigorosi su ciò che fa la tua macro e su come la fa (ad esempio, non è possibile eseguire codice arbitrario quando syntax-caseviene espansa una macro definita da Scheme ). Ciò può semplificare la scrittura di programmi che "comprendono" la macro e può fornire ulteriore supporto per gli strumenti.

D'altra parte, ci sono alcuni casi in cui le macro antigieniche possono essere utili. Ad esempio, se in realtà vuoi catturare un'associazione per una variabile specifica (ad esempio macro anaforiche ), penso che tu sia sfortunato se hai solo macro igieniche.


2
gensymimpedisce alla macro di fare casualmente con l'utente macro, ma non impedisce all'utente di fare casini con la macro. Ad esempio, un utente di macro può ridefinire ifo qualcosa del genere. (La domanda "perché qualcuno dovrebbe farlo" è irrilevante. Questo è un semplice esempio che dimostra che è possibile, ed è difficile ragionare su macro non igieniche)
Phil

2
Le macro non igieniche sono sicuramente utili. Non sono sicuro di Scheme, ma Racket ha molte operazioni "igienizzanti". Le macro della lingua sono igieniche per impostazione predefinita. Ti rendono molto consapevole quando rompi l'igiene.
Phil
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.