2010-08-14 11 views
21

Perché qualcuno dovrebbe preferire macro Scheme su macro Common Lisp (e sinceramente voglio anche saperlo, non sto cercando di essere un troll)?Quali sono i vantaggi delle macro di schema?

La mia esperienza come Lisp newb è che le macro in stile Common Lisp sono molto più facili da imparare rispetto alle macro di Scheme. Non ho ancora visto alcun vantaggio per le macro di Scheme, ma ovviamente ciò non significa che non esistano.

So che i macro Scheme sono "hygenic", ma non sono ancora convinto che ciò valga la complessità aggiuntiva. D'altra parte, ovviamente, sono persone convinte che ciò sia necessario, altrimenti non ci sarebbero implementazioni di macro Scheme in Common Lisp.

Per farla breve, qualcuno può difendere i macro di Scheme per me?

risposta

17

Le macro di schema introducono due concetti, essenzialmente ortogonali: igiene e corrispondenza dei motivi. L'igiene è meno importante in un Lisp2 come Common Lisp. Il linguaggio di corrispondenza dei pattern cattura molti degli idiomi macro comuni, ma ha il problema che è essenzialmente una lingua diversa dallo schema. Probabilmente la migliore introduzione alle macro dello schema, insieme a Sriram Krishnamurthi negli PLAI capitoli 36 e 37.

Ho il sospetto che la ragione per cui le persone scrivono i sistemi a macroistruzione dello schema in comune lisp sia più per la corrispondenza del modello che per l'igiene

7

perché utilizzano un diverso, un linguaggio non-Scheme, macro Schema sono meno potenti macro Common Lisp in senso quasi formale: si possibile fare arbitraria fase di compilazione di calcolo con loro, ma è peloso e complicata. È molto simile all'argomento per non utilizzare set!: less-powerful set! lingue libere produce codice meno buggato in cambio di una gestione scomoda dello stato. Ogni volta che scambi il potere per la disciplina, scommetti che sarai in grado di costruire sistemi più complessi a lungo termine.

Questo è l'argomento migliore che ho visto per le macro Scheme su quelle Common Lisp: se si sta costruendo un linguaggio complesso su Scheme, è meno probabile introdurre macro bug sottili se si passa con il sistema macro standard.

Personalmente, non creo grandi linguaggi utilizzando macro, quindi preferisco le macro Common Lisp. Li trovo molto più facili per i lavori di piccole dimensioni ed evitare la cattura variabile, ecc. Non è un grosso problema su piccola scala.

+4

"Le macro di schema" sono * non * meno potenti delle macro di CL - sono solo le 'sintassi-regole 'con corrispondenza di pattern che sono meno potenti. Le macro arbitrarie 'syntax-case' sono potenti come le macro CL, e in effetti più potenti poiché le macro CL quasi ignorano le informazioni lessicali. –

+0

@Eli Barzilay: diverse implementazioni CL forniscono le informazioni lessicali utilizzando l'interfaccia agli 'ambienti' descritti in CLtL2. –

+1

Nota che ho detto * quasi-formale *. Sono abbastanza sicuro che Oleg ha dimostrato che anche 'syntax-rules' è completo di Turing. A mio avviso, le restrizioni su 'syntax-rules' e' syntax-case', anche se 'syntax-case' hanno modi più semplici intorno a loro, sono in atto per prevenire bug sottili in macro complesse (e per rendere pubblici documenti pubblicabili). Ma penso anche che queste restrizioni rendono i macro semplici molto meno convenienti rispetto al sistema macro CL. –

4

Le macro di schema conservano referential transparency.

Citando il "Guile Manuale di riferimento" 6.10.2.2 Igiene:

sintassi-rules macro (..) preservare la trasparenza referenziale. Quando si legge una definizione di macro, tutti i collegamenti liberi in quella macro vengono risolti relativi alla definizione della macro; e quando si legge una istanza della macro , tutte le associazioni libere in quell'espressione vengono risolte relative all'espressione.

Questa proprietà è a volte conosciuta come igiene e aiuta nel codice pulizia. Nelle tue definizioni macro puoi sentirti libero di introdurre le variabili temporanee , senza preoccuparti di introdurre inavvertitamente i collegamenti nell'espansione macro.

Offerte schema standard syntax-rules e syntax-case.

+0

Tuttavia, l'acquisizione variabile può essere una funzionalità desiderabile. C'è un modo per farlo con la macro di Scheme? –

Problemi correlati