2010-03-26 32 views
6

Tôi đã viết các macro Common Lisp, vì vậy các macro R5Rs của Scheme có một chút không tự nhiên đối với tôi. Tôi nghĩ Tôi có ý tưởng, ngoại trừ việc tôi không hiểu tại sao người ta sẽ sử dụng các mẫu vector trong cú pháp-luật:Các mẫu vectơ được sử dụng như thế nào trong các quy tắc cú pháp?

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

tôi không thấy làm thế nào tôi muốn sử dụng một macro mà yêu cầu đối số của nó được viết dưới dạng vectơ:

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

Có loại kỹ thuật nào sử dụng các mẫu đó không?

Cảm ơn bạn!

Trả lời

1

Macro có thể không yêu cầu đối số của nó được viết dưới dạng vectơ, nhưng vẫn cung cấp hành vi hữu ích khi chúng là. Ví dụ đáng chú ý nhất có lẽ sẽ là 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) 

Một ví dụ khác, xem this pattern matching package mà cho phép phù hợp trên vectơ và do đó sử dụng mô hình vector trong định nghĩa vĩ mô của nó (bao gồm trên được liên kết đến trang cùng với các siêu dữ liệu gói) .

+0

Cảm ơn bạn! Bây giờ nó có ý nghĩa hơn rất nhiều! :-) – Jay

Các vấn đề liên quan