Question

Y a-t-il des analogies avec Scheme define-syntax en ELisp ?Dans define-syntax Je peux préciser quelques mots-clés et en elisp defmacro il semble que je ne peux pas.MODIFIER:Soit je ne vous comprends pas bien, soit ma question n'est pas claire.Dans le schéma, il est possible de définir une macro avec des mots réservés comme

(boucle for un in une liste

(boucle while

Dans Emacs Lisp, je n'ai trouvé aucun moyen d'introduire un tel sucre.Tout au plus, je peux faire une macro, qu'il faut appeler comme

(Loop pour une liste (faire beaucoup de choses…)

La lisibilité compte

Était-ce utile?

La solution

Scheme et Elisp ont tous deux des systèmes de macros.Les "mots-clés" define-syntax et defmacro les deux introduisent un nom pour une macro définie par l'utilisateur.

Au moment où une macro, foo, est utilisée dans le code réel, disons (foo 1 bar) l'extenseur de macro doit déterminer comment réécrire le formulaire donné, (foo 1 bar), sous une forme plus simple qui ne contient pas de macros utilisateur.L'extenseur de macro appelle la fonction qui a été définie au moment de l'exécution de la macro. foo a été définie.C'est à dire.il appelle la fonction que vous avez spécifiée avec define-syntax ou defmacro avec une représentation de la forme, (foo 1 bar).La représentation peut être sous forme d'"objets de syntaxe" ou de listes simples (cela diffère selon les différents systèmes de macros).

C'est mon point de vue sur les similitudes entre define-syntax et defmacro.

Les systèmes macro de R5RS Scheme et Elisp sont cependant différents.

L'extenseur de macro associé à foo peut dans le schéma R5RS être spécifié à l'aide de syntax-rules.Cela vous permet d'utiliser la correspondance de modèles pour spécifier les règles de réécriture (en interne, le formulaire de règles de syntaxe sera évalué pour fonctionner).Autres différences :L'algorithme d'expansion des macros dans le schéma R5RS vous aidera à introduire par inadvertance des noms entrant en conflit avec des noms provenant d'autres parties de votre programme (par exemple, à partir d'une bibliothèque, vous ne l'avez pas écrit vous-même).Historiquement, en raison de la façon dont les espaces de noms fonctionnent dans LISP, ce problème n'est pas un gros problème dans Lisp, mais il est possible de faire des erreurs.

Historiquement, Scheme et Elisp utilisaient tous deux le même algorithme d'expansion de macro, mais Schemers a ensuite commencé à expérimenter d'autres algorithmes.Le système de « règles de syntaxe » a été introduit dans R5RS, mais l'évolution ne s'est pas arrêtée là.De nos jours, toutes les implémentations modernes de Scheme ont (des variantes du) système « syntax-case ».

Certaines implémentations ont travaillé pour que cet algorithme d'expansion fonctionne avec des modules (Racket, implémentations R6RS et autres).

En bref, lorsque vous lisez des informations sur les systèmes de macros Scheme, veillez à examiner précisément la variante sur laquelle vous lisez.Si vous lisez des informations sur les restrictions, vous avez probablement trouvé un texte sur le (maintenant plutôt ancien) syntax-rules système.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top