2010-03-26 8 views
6

Ich habe Common-Lisp-Makros geschrieben, daher sind die R5R-Makros von Scheme für mich etwas unnatürlich. Ich denke, ich auf die Idee kam, mit der Ausnahme, dass ich verstehe nicht, wie ein Vektor-Muster in der Syntax-Regeln verwenden würde:Wie werden Vektormuster in Syntaxregeln verwendet?

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

Ich sehe nicht, wie ich einen Makro verwenden würde, der seine Argumente erfordert als ein Vektor geschrieben werden:

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

Gibt es eine Art von Technik, die diese Muster verwendet?

Vielen Dank!

Antwort

1

Ein Makro benötigt möglicherweise nicht seine Argumente, um als ein Vektor geschrieben zu werden, bietet jedoch nützliches Verhalten für, wenn sie sind. Das bemerkenswerteste Beispiel wahrscheinlich quasiquote würde:

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

Als ein weiteres Beispiel siehe this pattern matching package, die auf Vektoren ermöglichen passende und somit verwendet Vektor-Muster in seinen Makrodefinitionen (auf dem verlinkten Seiten zusammen mit den Paket-Metadaten) .

+0

Vielen Dank! Jetzt macht es viel mehr Sinn! :-) – Jay