Domanda

Ho scritto le macro Common Lisp, quindi macro R5RS di Scheme sono un po 'innaturale per me. I pensare ho avuto l'idea, solo che io non capisco come si potrebbe usare modelli vettoriali in sintassi-regole:

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

Non vedo come mi piacerebbe utilizzare una macro che richiede i suoi argomenti per essere scritto come un vettore:

(mac #(1 2 3 4))
=>
1
4

C'è una sorta di tecnica che utilizza quei modelli?

Grazie!

È stato utile?

Soluzione

Una macro potrebbe non richiedere i suoi argomenti da scrivere come un vettore, ma fornire un comportamento utile per quando sono. L'esempio più notevole sarebbe probabilmente 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)

Come altro esempio, vedi questo pattern matching pacchetto che permette matching sui vettori e utilizza quindi modelli vettore nelle definizioni di macro (incluse sulla legato a pagina insieme con i metadati pacchetto).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top