Как создать макрос, который генерирует другой макрос в SISC / Scheme?
В Guile или с использованием SRFI-46 это возможно, как показано в разделе "Задание пользовательского идентификатора эллипса". Но возможно ли это в SISC или в "чистой схеме" R5RS?
Я знаю, что это возможно без использования многоточия, но что, если мне нужно использовать внутренний многоточие, как в примере ниже?
(define-syntax define-quotation-macros
(syntax-rules ()
((_ (macro-name head-symbol) ...)
(begin (define-syntax macro-name
(syntax-rules ::: ()
((_ x :::)
(quote (head-symbol x :::)))))
...))))
(define-quotation-macros (quote-a a) (quote-b b) (quote-c c))
(quote-a 1 2 3) ⇒ (a 1 2 3)
1 ответ
Решение
Макроэкспандер, используемый в SISC, psyntax, поддерживает другой способ создания внутренних эллипсов, используя ...
макро. Вы можете написать это, применив ...
макрос для каждого внутреннего эллипса, который вы хотите использовать:
(define-syntax define-quotation-macros
(syntax-rules ()
((_ (macro-name head-symbol) ...)
(begin (define-syntax macro-name
(syntax-rules ()
((_ x (... ...))
'(head-symbol x (... ...)))))
...))))
или вы можете применить его к внешней форме, где все эллипсы внутри должны быть внутренними:
(define-syntax define-quotation-macros
(syntax-rules ()
((_ (macro-name head-symbol) ...)
(begin (define-syntax macro-name
(... (syntax-rules ()
((_ x ...)
'(head-symbol x ...)))))
...))))