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!

Était-ce utile?

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).

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