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!

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top