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

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

Есть ли некоторая техника, которая использует те шаблоны?

Спасибо!

6
задан Jay 26 March 2010 в 21:11
поделиться

1 ответ

Макрос может не требовать, чтобы его аргументы были записаны как вектор, но при этом обеспечивать полезное поведение. Самым ярким примером, вероятно, может быть квазицитат:

;; 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)

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

1
ответ дан 17 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: