2010-03-26 11 views
6

Ho scritto macro Common Lisp, quindi le macro di R5Rs di Scheme sono un po 'innaturali per me. Io penso ho avuto l'idea, solo che io non capisco come si potrebbe usare modelli vettoriali in sintassi-regole:Come vengono utilizzati i pattern vettoriali nelle regole della sintassi?

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

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

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

Esiste un tipo di tecnica che utilizza tali schemi?

Grazie!

risposta

1

Una macro potrebbe non richiedere che i suoi argomenti siano scritti come vettore, ma fornire un comportamento utile per quando lo 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, vedere this pattern matching package che permette matching sui vettori e utilizza quindi modelli vettore nelle definizioni di macro (incluse sulla legato a pagina insieme con i metadati pacchetto) .

+0

Grazie! Ora ha molto più senso! :-) – Jay