Je souhaite créer une macro d'aide pour écrire des extensions de correspondance. J'ai quelque chose comme ceci:Comment lier les variables "repos" à la liste de valeurs dans la macro dans le schéma
(define-match-expander my-expander
(λ (stx)
(let* ([dat (cdr (syntax-e stx))]
[var1 (car dat))]
[var2 (cadr dat)])
;transformer goes here)))
Donc je voulais une macro qui le fera laisser la liaison. Je l'ai commencé avec quelque chose comme ceci:
(define-syntax-rule (define-my-expander (id vars ...) body)
(define-match-expander id
(λ (stx)
(match-let ([(vars ...) (cdr (syntax-e stx))])
body))))
mais match-let
n'est pas définie dans le temps de transformation.
La première question serait: y a-t-il une autre façon de faire cela (ce qui veut dire que ce sont des expandeurs)? Peut-être y a-t-il déjà quelque chose de similaire dans le plt-scheme que je ne connais pas, ou je le fais d'une manière ou d'une autre.
Indépendamment de la réponse à la première question, si jamais je veux lier la liste des variables à la liste des valeurs à l'intérieur d'une macro, comment dois-je faire?
EDIT: En combinaison avec la macro réponse Eli ressemble maintenant à ceci:
(define-syntax-rule (define-my-expander (id vars ...) body)
(define-match-expander id
(λ (stx)
(syntax-case stx()
[(_ vars ...)
body]))))
Merci, ceci m'a été utile et utile pour m'aider à résoudre mon problème. Par souci d'exhaustivité, si je ne faisais pas d'expandeurs, mais disons, une macro qui se développe en quelque chose qui a lambda qui prend une liste et que je veux lier des éléments de liste à des paramètres de macro? – Slartibartfast
Dans la plupart des cas, vous écrivez des macros à l'aide de travaux de correspondance de modèles. Mais de temps en temps (peut-être plus fréquemment lorsque vous écrivez des macros plus avancées avec des problèmes comme de bons messages d'erreur), vous devez les transformer en une liste. Pour cela, vous pouvez utiliser quelque chose comme '(syntax-> list # '(stuff ...))' - il prend l'objet de syntaxe entre parenthèses, et le transforme en une liste d'objets de syntaxe. –