6

我一直在写 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

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

谢谢!

4

1 回答 1

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)

作为另一个示例,请参阅此模式匹配包,它允许在向量上进行匹配,因此在其宏定义中使用向量模式(与包元数据一起包含在链接到的页面上)。

于 2010-04-01T03:35:19.253 回答