我一直在编写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
是否有某种技术使用这些模式?
谢谢!
答案 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,它允许匹配矢量,因此在其宏定义中使用矢量模式(包含在链接页面和包元数据中)。