2010-08-14 7 views
21

Pourquoi est-ce que quelqu'un préférerait les macros de Scheme sur les macros Common Lisp (et je veux vraiment savoir aussi, je n'essaie pas d'être un troll)? Mon expérience en tant que newb Lisp est que les macros de style Common Lisp sont beaucoup plus faciles à apprendre que les macros de Scheme. Je n'ai encore vu aucun avantage aux macros de Scheme, mais bien sûr cela ne signifie pas qu'elles n'existent pas. Je sais que les macros de Scheme sont "hygiéniques", mais je ne suis toujours pas convaincu que cela vaille la complexité supplémentaire. D'un autre côté cependant, est personnes qui sont convaincues que cela est nécessaire, sinon il n'y aurait pas d'implémentation de macros Scheme en Common Lisp.Quels sont les avantages des macros de schéma?

Pour faire une histoire courte, quelqu'un peut-il défendre les macros de Scheme à moi?

Répondre

17

Les macros schématiques introduisent deux concepts, essentiellement orthogonaux: l'hygiène et l'appariement de formes. L'hygiène est moins importante dans un Lisp2 comme le Lisp commun. Le langage de correspondance de motifs capture beaucoup des idiomes de macro communs, mais a le problème qu'il s'agit essentiellement d'un langage différent du schéma. Probablement la meilleure introduction aux macros du système, avec une partie de la logique derrière eux est PLAI chapitres de Shriram Krishnamurthi et 36. 37

Je soupçonne que la raison pour laquelle les gens écrivent schémas de style de style en lisp commun est plus pour la correspondance de modèle que pour l'hygiène.

7

Parce qu'ils utilisent un autre langage non Scheme, les macros Scheme sont moins puissantes que les macros Common Lisp au sens presque formel: vous pouvez faire le calcul de la compilation arbitraire avec eux, mais il est poilu et alambiquée. Cela ressemble beaucoup à l'argument de ne pas utiliser set!: les langues libres moins puissantes set! produisent moins de code bogué en échange d'une gestion maladroite de l'état. Chaque fois que vous échangez le pouvoir contre la discipline, vous pariez que vous serez en mesure de construire des systèmes plus complexes à long terme. C'est le meilleur argument que j'ai vu pour les macros de Scheme sur celles de Common Lisp: si vous construisez un langage complexe au-dessus de Scheme, vous risquez moins d'introduire des bugs macro subtils si vous respectez le système de macros standard.

Personnellement, je ne construis pas de gros langages en utilisant des macros, donc je préfère les macros Common Lisp. Je les trouve beaucoup plus faciles pour les petits travaux et en évitant la capture variable, etc n'est pas un gros problème à petite échelle.

+4

Les macros de schémas ne sont pas moins puissantes que les macros CL - seules les règles de syntaxe restreintes par appariement de motifs sont moins puissantes. Les macros de style 'syntax-case' arbitraires sont aussi puissantes que les macros CL, et en fait plus puissantes car les macros CL ignorent presque toutes les informations lexicales. –

+0

@Eli Barzilay: plusieurs implémentations CL fournissent l'information lexicale en utilisant l'interface aux 'environnements' décrits dans CLtL2. –

+1

Notez que j'ai dit * presque-formel *. Je suis à peu près sûr qu'Oleg a montré que même les 'règles de syntaxe 'sont complètes. À mon avis, les restrictions sur «syntax-rules» et «syntax-case», même si «syntax-case» a des moyens plus simples, sont en place pour éviter les bogues subtils dans les macros complexes (et de faire des documents publiables bien sûr). Mais je pense aussi que ces restrictions rendent les macros simples beaucoup moins pratiques qu'avec le système macro CL. –

4

Les macros de schéma conservent referential transparency.

Citant le 6.10.2.2 Hygiène "Manuel Guile Référence":

macros syntaxe-règles (..) préserver la transparence référentielle. Lorsque vous lire une définition de macro, toutes les liaisons libres dans cette macro sont résolues par rapport à la définition de macro; et lorsque vous lisez une macro instanciation, toutes les liaisons libres dans cette expression sont résolues par rapport à l'expression.

Cette propriété est parfois connue sous le nom d'hygiène, et aide le code . Dans vos définitions de macro, vous pouvez vous sentir libre d'introduire des variables temporaires , sans vous soucier d'introduire par inadvertance des liaisons dans la macro extension.

Le schéma standard propose syntax-rules et syntax-case.

+0

Cependant, la capture de variables peut être une caractéristique souhaitable. Y a-t-il un moyen de le faire avec la macro de Scheme? –

Questions connexes