如何在语法规则中使用矢量模式?

时间:2010-03-26 21:11:02

标签: macros lisp scheme syntax-rules define-syntax

我一直在编写Common Lisp宏,所以Scheme的R5Rs宏对我来说有点不自然。我认为我明白了,除了我不明白如何在语法规则中使用矢量模式:

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

我没有看到我如何使用需要将其参数写为向量的宏:

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

是否有某种技术使用这些模式?

谢谢!

1 个答案:

答案 0 :(得分:1)

宏可能不需要将其参数写为向量,而是在它们何时提供有用的行为。最值得注意的例子可能是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)

作为另一个例子,请参阅this pattern matching package,它允许匹配矢量,因此在其宏定义中使用矢量模式(包含在链接页面和包元数据中)。