Come sono modelli vettoriali utilizzati nella sintassi regole?
-
22-09-2019 - |
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!
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).