Как векторные шаблоны используются в синтаксических правилах?

StackOverflow https://stackoverflow.com/questions/2526777

Вопрос

Я писал макросы 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)

В качестве другого примера смотрите этот пакет, соответствующий шаблону который позволяет сопоставлять векторы и, таким образом, использует векторные шаблоны в своих определениях макросов (включены на странице со ссылками вместе с метаданными пакета).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top