2010-03-26 7 views
6

He estado escribiendo macros Common Lisp, por lo que las macros R5Rs de Scheme son un poco antinaturales para mí. Yo creo me ocurrió la idea, excepto que no entiendo cómo se podría utilizar patrones de vectores en la sintaxis de reglas:¿Cómo se usan los patrones de vectores en las reglas de sintaxis?

(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 debe escribirse como un vector:

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

¿Existe algún tipo de técnica que utilice esos patrones?

¡Gracias!

Respuesta

1

Una macro puede no requerir que sus argumentos se escriban como un vector, pero proporcionan un comportamiento útil para cuando lo son. El ejemplo más notable probablemente sería 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 this pattern matching package 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) .

+0

¡Gracias! ¡Ahora tiene mucho más sentido! :-) – Jay

Cuestiones relacionadas