2010-03-26 11 views
6

Pisałem makra Common Lisp, więc makra R5R programu Scheme są dla mnie trochę nienaturalne. myślę wpadłem na pomysł, tyle że ja nie rozumiem, jak można by wykorzystać wzory wektor w składni reguł:W jaki sposób używane są wzorce wektorowe w regułach składniowych?

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

nie widzę jak bym użyć makra, które wymaga od swoich argumentów do zapisania jako wektor:

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

Czy istnieje jakaś technika wykorzystująca te wzory?

Dziękujemy!

Odpowiedz

1

Makro może nie wymagać zapisywania jego argumentów jako wektora, ale zapewnia użyteczne zachowanie, gdy są. Najbardziej godnym uwagi przykładem prawdopodobnie 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) 

Jako inny przykład, patrz this pattern matching package który umożliwia dopasowanie na wektorach i tym samym wykorzystuje wzory wektor w jej makro definicjami (ujęte w połączony do strony wraz z metadanych pakietu) .

+0

Dziękujemy! Teraz ma to dużo więcej sensu! :-) – Jay

Powiązane problemy