Как создать макрос, который генерирует другой макрос в 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 ...)))))
            ...))))
Другие вопросы по тегам