Я писал макросы языка Common LISP, таким образом, макросы Схемы 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
Есть ли некоторая техника, которая использует те шаблоны?
Спасибо!
Макрос может не требовать, чтобы его аргументы были записаны как вектор, но при этом обеспечивать полезное поведение. Самым ярким примером, вероятно, может быть квазицитат:
;; 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)
В качестве другого примера см. этот пакет сопоставления с образцом , который позволяет сопоставление векторов и, таким образом, использует векторные шаблоны в своих определениях макросов (вместе с ними включены в связанную страницу с метаданными пакета).