Comment les modèles vectoriels utilisés dans la syntaxe des règles?
-
22-09-2019 - |
Question
Je suis en train d'écrire des macros Common Lisp, de sorte que les macros r5rs de Scheme sont un peu contre nature pour moi. I pense J'ai eu l'idée, sauf que je ne comprends pas comment on pourrait utiliser des modèles vectoriels dans la syntaxe des règles:
(define-syntax mac
(syntax-rules ()
((mac #(a b c d))
(let ()
(display a)
(newline)
(display d)
(newline)))))
(expand '(mac #(1 2 3 4))) ;; Chicken's expand-full extension shows macroexpansion
=> (let746 () (display747 1) (newline748) (display747 4) (newline748))
Je ne vois pas comment j'utiliser une macro qui exige que ses arguments à écrire comme vecteur:
(mac #(1 2 3 4))
=>
1
4
Y at-il une sorte de technique qui utilise ces motifs?
Merci!
La solution
Une macro peut ne pas exiger de ses arguments à écrire comme un vecteur, mais fournir un comportement utile quand ils sont. L'exemple le plus notable serait probablement quasiquote:
;; a couple of test variables
(define foo 1)
(define bar 2)
;; vector literals in Scheme are implicitly quoted
#(foo bar) ; returns #(foo bar), i.e. a vector of two symbols
;; however quasiquote / unquote can reach inside them
`#(,foo ,bar) ; returns #(1 2)
Comme autre exemple, voir ce paquet de correspondance de motif qui permet correspondant à des vecteurs et utilise ainsi des motifs de vecteurs dans ses définitions de macros (inclus sur le lien à la page en même temps que les métadonnées de paquet).