Как векторные шаблоны используются в синтаксических правилах?
-
22-09-2019 - |
Вопрос
Я писал макросы Common Lisp, поэтому макросы R5Rs Scheme для меня немного неестественны.Я подумай У меня появилась идея, за исключением того, что я не понимаю, как можно было бы использовать векторные шаблоны в синтаксических правилах:
(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)
В качестве другого примера смотрите этот пакет, соответствующий шаблону который позволяет сопоставлять векторы и, таким образом, использует векторные шаблоны в своих определениях макросов (включены на странице со ссылками вместе с метаданными пакета).