¿Cómo son los patrones de vectores utilizados en la sintaxis de las reglas?
-
22-09-2019 - |
Pregunta
He estado escribiendo macros Common Lisp, por lo que las macros de Scheme R5RS son un poco antinatural para mí. I que me ocurrió la idea, excepto que no entiendo cómo se podría utilizar patrones de vectores en la sintaxis de reglas:
(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))
No veo la forma en que haría uso de una macro que requiere sus argumentos para ser escrito como un vector:
(mac #(1 2 3 4))
=>
1
4
¿Hay algún tipo de técnica que utiliza esos patrones?
Gracias!
Solución
Una fuerza macro no requieren sus argumentos para ser escrito como un vector, sin embargo, proporcionan un comportamiento útil para cuando lo sean. El ejemplo más notable sería probablemente 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)
Como otro ejemplo, ver este paquete de coincidencia de patrones que permite a juego en vectores y por lo tanto utiliza los modelos del vector en sus definiciones de macro (incluido en el ligado a la página, junto con los metadatos del paquete).